Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("America/New_York"));
try {
System.out.println(df.format(cal.getTime()));
System.out.println(df.parse(df.format(cal.getTime())));
} catch (ParseException e) {
e.printStackTrace();
}
Here is the result:
2011-09-24 14:10:51 -0400
Sat Sep 24 20:10:51 CEST 2011
Why when I parse a date I get from format() it doesn't respect the timezone?
From the spec, it return EPOCH time
DateFormat.parse()
is NOT a query (something that returns a value and doesn't change the state of the system). It is a command which has the side-effect of updating an internalCalendar
object. After callingparse()
you have to access the timezone either by accessing theDateFormat
'sCalendar
or callingDateFormat.getTimeZone()
. Unless you want to throw away the original timezone and use local time, do not use the returnedDate
value fromparse()
. Instead use the calendar object after parsing. And the same is true for the format method. If you are going to format a date, pass the calendar with the timezone info into theDateFormat
object before callingformat()
. Here is how you can convert one format to another format preserving the original timezone:It's messy but necessary since
parse()
doesn't return a value that preserves timezone andformat()
doesn't accept a value that defines a timezone (theDate
class).You're printing the result of calling
Date.toString()
, which always uses the default time zone. Basically, you shouldn't useDate.toString()
for anything other than debugging.Don't forget that a
Date
doesn't have a time zone - it represents an instant in time, measured as milliseconds since the Unix epoch (midnight on January 1st 1970 UTC).If you format the date using your formatter again, that should come up with the same answer as before.
As an aside, I would recommend the use of Joda Time instead of
Date
/Calendar
if you're doing any significant amount of date/time work in Java; it's a much nicer API.