2

常にUTC形式で時間を入力するWebサービスアプリケーションがあります

2012-12-06T05:00:00.000Z

日付を解析してJava util Dateオブジェクトにするコードは次のとおりです

 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();

最近、アプリケーションが最初に起動すると、返された日付が Thur Dec 06 00:00:00 EST 2012 のように正しく出力されるという奇妙なことが観察されました。

私たちはESTタイムゾーンにいるので。その後、しばらくして、何らかの実行を行った後、アプリケーションを再起動しなくても、同じ日付が Thur Dec 06 05:00:00 UTC 2012 として出力されます。

私はアプリケーションを掘り下げてきましたが、アプリケーションのデフォルトのタイムゾーンをリセットするような変更は見当たりません。どうしてそれが起こり得ますか?これに取り組み始めてから 1 週間が経ちましたが、まだわかりません :-(

また、システムのタイムゾーンが変更されないため、アプリケーションがシステムのタイムゾーンを使用し続けることを確認する方法はありますか?

ヘルプ/ヒントをありがとう

4

1 に答える 1

5

残念なことに、 TimeZone は、 を呼び出すことを決定した不適切に記述されたコードによって、アプリケーションの下から変更される可能性がありますTimeZone.setDefault。サードパーティのコードがそのメソッドを呼び出したときに、アプリケーションで実際にこれに悩まされました。残念ながら、解決策は、アプリケーションの開始以降はデフォルトの TimeZone に依存しないことです。起動時にデフォルトの TimeZone を取得するコア クラスがあり、システムのデフォルトを使用して日付を出力する必要がある後続のすべてのコードは、この隠しインスタンスを明示的に使用します(もちろん変更に対して保護されています。TimeZone は変更可能であることを忘れないでください! )。

于 2012-10-16T01:38:22.400 に答える