gigi2
gigi2

Reputation: 2194

Java date with timezone changed secretly?

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

Answers (1)

jtahlborn
jtahlborn

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

Related Questions