Question

I've been trying to convert the time since epoch until today and display it in Eastern Standard Time. Here is what outputs on the remote machine (it's remotely hosted):

Date now = new Date(System.currentTimeMillis());
System.out.println(now.toString());
// Thu Apr 24 14:36:11 MST 2014

No idea what MST is, but I want to get the current milliseconds since epoch in EST, and display the result in EST.

No matter what I do, I can't get daylights savings to work (it's currently Daylights Savings Time in the EST Time Zone); I either end up in PST, GMT or UTC, and when I do get "EST" it's either some random value or 1 hour behind or 3 hours behind.

I would like the output to be formatted using this DateFormat:

DateFormat EXPIRE_FORMAT = new SimpleDateFormat("MMM dd, yyyy h:mm a z");
Was it helpful?

Solution

Just set the time zone you want the time to be displayed in using DateFormat#setTimeZone(TimeZone)

Date now = new Date(System.currentTimeMillis());
DateFormat EXPIRE_FORMAT = new SimpleDateFormat("MMM dd, yyyy h:mm a z");
EXPIRE_FORMAT.setTimeZone(TimeZone.getTimeZone("America/Montreal")); // or whatever relevant TimeZone id 
System.out.println(EXPIRE_FORMAT.format(now));

AFAIK, there is no EST currently. It's all EDT in Spring.

The above prints

Apr 24, 2014 5:53 PM EDT

OTHER TIPS

The comments and the answer by Sotirios Delimanolis are correct.

Avoid 3 or 4 Letter Time Zone Codes

You should avoid the 3 or 4 letter codes for time zones as they are neither standardized nor unique. Instead use proper time zone names, usually a continent+city.

Avoid j.u.Date

The java.util.Date and .Calendar & SimpleDateFormat classes bundled with Java are notoriously troublesome. Use a decent date-time library with an updated time zone database. For Java, that means either Joda-Time or the new java.time package in Java 8 (inspired by Joda-Time).

Avoid Milliseconds-Since-Epoch

I suggest you avoid working with milliseconds since epoch. Gets confusing fast as the number is meaningless when read by a human. Let the date-time library manage the milliseconds for you.

Specify Time Zone

Generally best to specify the desired/intended time zone. If you omit the time zone, all the major date-time libraries (java.util.Date, Joda-Time, java.time) apply the JVM's default time zone.

Joda-Time Example

Example code in Joda-Time 2.3.

DateTimeZone timeZoneToronto = DateTimeZone.forID( "America/Toronto" );
DateTime dateTimeToronto = new DateTime( timeZoneToronto ); // Current moment.
DateTime dateTimeUTC = dateTimeToronto.withZone( DateTimeZone.UTC );
DateTime dateTimeParis = dateTimeToronto.withZone( DateTimeZone.forID( "Europe/Paris" ) );

If you really want the milliseconds since epoch, call the getMillis method. In example code above, all three DateTime objects have the same number of milliseconds-since-epoch.

long millis = dateTimeToronto.getMillis();

If you need a java.util.Date for use with other classes…

java.util.Date date = dateTimeToronto.toDate();

While Joda-Time uses the ISO 8601 standard formats as its defaults, you may specify other formats for generating strings.

DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMM dd, yyyy h:mm a z" );
String output = formatter.print( dateTimeToronto );
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top