TK2020
TK2020

Reputation: 85

Java Current Date/Time displays 1 hour ahead that original time

When I try to print the current date and time using Calender instance, the result I get is 1 hour ahead from the actual time.

I am working in remote machine which runs with EST time zone. Below is what I tried, but nothing works.

Calendar cal = Calendar.getInstance(TimeZone.getDefault());
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
Calendar cal = Calendar.getInstance(Locale.ENGLISH);

System.out.println("Current Date & Time: " +calendar.getTime());

o/p:
Time: Sat Dec 28 11:55:10 UTC 2013

But expected o/p: 
Time: Sat Dec 28 10:55:10 UTC 2013

All the 3 types give same result. I couldn't understand what I miss out to get the exact date & time. Is this problem related to daylight time saving ?

Could someone help me to overcome this problem. Thanks in Advance.

Upvotes: 3

Views: 6006

Answers (3)

MrSalesi
MrSalesi

Reputation: 394

Some governments change their policies about summer time and save energy clock,

I my Case Iran's government cancels summer time so my java out put time was 1 hover ahead

enter image description here

I solve it using this link instruction

1- Download this

2- Download tzdata

3- Extract ziupdater-1.1.1.1.jar in java home folder

4- For windows users type command below in cmd in administrator mode while all java program is stoped and reset windows

java -jar ziupdater-1.1.1.1.jar -l file://<path to tzdata archive>

note: if you have more than one JRE you must run it in its bin folder separately

Upvotes: 0

Basil Bourque
Basil Bourque

Reputation: 338181

Avoid 3-Letter Time Zone

Never use the 3-letter time zone codes. They are neither standardized nor unique. Your "EST" can mean at least these:

  • Eastern Standard Time (USA)
  • Eastern Standard Time (Australia)
  • Eastern Brazil Standard Time

Use time zone names.

Avoid j.u.Date/Calendar

You have discovered one of the many reasons to avoid using java.util.Date & java.util.Calendar classes bundled with Java: A Date instance has no time zone information yet its toString method confusingly renders a string based on your Java environment's default time zone.

Use Joda-Time

Use a competent date-time library. In Java that means either Joda-Time, or in Java 8, the new java.time.* classes (inspired by Joda-Time).

Example code…

// Default time zone
DateTime dateTime_MyDefaultTimeZone = new DateTime();

// Specific time zone. If by "EST" you meant east coast of United States, use a name such as New York.
DateTimeZone timeZone = DateTimeZone.forID( "America/New_York" );
DateTime dateTime_EastCoastUS = new DateTime( timeZone );

Dump to console…

System.out.println( "dateTime_MyDefaultTimeZone: " + dateTime_MyDefaultTimeZone );
System.out.println( "dateTime_EastCoastUS: " + dateTime_EastCoastUS );
System.out.println( "date-time in UTC: " + dateTime_EastCoastUS.toDateTime( DateTimeZone.UTC ) );

When run…

dateTime_MyDefaultTimeZone: 2013-12-28T18:51:18.485-08:00
dateTime_EastCoastUS: 2013-12-28T21:51:18.522-05:00
date-time in UTC: 2013-12-29T02:51:18.522Z

Upvotes: 0

Meno Hochschild
Meno Hochschild

Reputation: 44061

It is again this old pitfall with java.util.Date: Its toString()-method which you indirectly use when printing calendar.getTime() uses your default time zone, not the time zone of your calendar instance (which you set to 'EST').

Solution:

Date currentTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("Current Date & Time: " + sdf.format(currentTime));

Explanations:

a) In first line no calendar instance is necessary because you are just interested in current global time (the same physical time independent from timezone). Calendar.getInstance() is also more consuming resources. Finally, both expressions new Date() and Calendar.getInstance(...).getTime() have no time zone reference when it is about the internal state. Only the toString()-method of j.u.Date uses default time zone.

b) You need to define an output format which is given in line 2. It is up to you to change it. Just study the pattern documentation of java.text.SimpleDateFormat.

c) You also need to define the time zone in your output format to help the format object to translate the global Date-instance into a timezone-aware representation. By the way, I had choosen the identifier 'America/New_York', not 'EST' because latter form can be sometimes ambigous. You should either choose the first form (IANA- or Olson time zone identifier) or the form 'GMT+/-HH:mm'.

d) The output itself is done with sdf.format(currentTime), not just currentTime (no implicit call of toString()).

e) To answer your question 'Is this problem related to daylight time saving ?': No, the time in time zone EST (America/New_York) is never in DST in december.

Conclusion:

If you can, you should try to avoid j.u.Date and j.u.Calendar because there are too many pitfalls. At the moment JodaTime is a better alternative, although not without issues.

Upvotes: 4

Related Questions