Reputation: 2194
we have a webservices application that always takes the input of time in its UTC format as
2012-12-06T05:00:00.000Z
and here is the code that parse the date into a java util Date object
private static final Pattern PATTERN = Pattern.compile(
"(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?(?:[Tt](?:(\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?(?:\\.(\\d{3}))?)?([Zz])?(?:([+-])(\\d{2}):(\\d{2}))?");
Matcher m = PATTERN.matcher(dateString);
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
int hoff = 0, moff = 0, doff = -1;
if (m.group(9) != null) {
doff = m.group(9).equals("-") ? 1 : -1;
hoff = doff * (m.group(10) != null ? Integer.parseInt(m.group(10)) : 0);
moff = doff * (m.group(11) != null ? Integer.parseInt(m.group(11)) : 0);
}
c.set(Calendar.YEAR, Integer.parseInt(m.group(1)));
c.set(Calendar.MONTH, m.group(2) != null ? Integer.parseInt(m.group(2))-1 : 0);
c.set(Calendar.DATE, m.group(3) != null ? Integer.parseInt(m.group(3)) : 1);
c.set(Calendar.HOUR_OF_DAY, m.group(4) != null ? Integer.parseInt(m.group(4)) + hoff: 0);
c.set(Calendar.MINUTE, m.group(5) != null ? Integer.parseInt(m.group(5)) + moff: 0);
c.set(Calendar.SECOND, m.group(6) != null ? Integer.parseInt(m.group(6)) : 0);
c.set(Calendar.MILLISECOND, m.group(7) != null ? Integer.parseInt(m.group(7)) : 0);
return c.getTime();
Recently an odd thing was observed that as the application first starts, the returned date will be just correctly printed as Thur Dec 06 00:00:00 EST 2012
since we are in EST timezone. Then after a while, after some execution, even without restart the application, the same date would be printed as Thur Dec 06 05:00:00 UTC 2012
I have been digging down in the application and I don't see any changes that would reset the default timezone of our application. How could that happen? It has been a week since we started working on this and we are still clueless :-(
Also, is there anyway to make sure the application keeps using the system timezone as that would not be changing?
thanks a lot for any help/hints
Upvotes: 2
Views: 292
Reputation: 53694
Unfortunately, the TimeZone can be changed out from under your application by any poorly written code which decides to call TimeZone.setDefault
. we were actually bitten by this in our application when third-party code called that method. the solution, unfortunately, is to never depend on the default TimeZone past the beginning of the application. we have a core class which gets the default TimeZone on startup, and all subsequent code which needs to output dates using the system default will explicitly use this stashed instance (which is of course protected against modification, don't forget that TimeZone is mutable!).
Upvotes: 5