1

ローカルタイムゾーンで作成されたDateオブジェクトのタイムゾーンをターゲットタイムゾーンにシフトするにはどうすればよいですか?

これが私が必要なものです。WebクライアントにDatePickerを使用して日付を選択させたいのですが、結果のDateオブジェクトは別のタイムゾーンで選択されたかのようになります。それを伝える方法がないのでDatePicker、手動で日付をシフトする必要があります。

たとえば、現在カリフォルニアで2012年4月6日午前2時42分です。作成日はUTC-7タイムゾーンになります。ヨーロッパ/モスクワのタイムゾーンで2012年4月6日午前2時42分にDateオブジェクトが必要です。

これが私が今やっているところです:

final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class);
final TimeZone timeZoneMsk = TimeZone.createTimeZone(constTz.europeMoscow());
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.americaLosAngeles());

Date curTime = new Date();

DateTimeFormat dateTimeFormat = DateTimeFormat.getFullDateTimeFormat();
Date mskTime = new Date(curTime.getTime() - (curTime.getTimezoneOffset() - timeZoneMsk.getStandardOffset()) * 60 * 1000);

String strLocal = dateTimeFormat.format(curTime, timeZoneCali); // Friday, 2012 April 06 02:42:59 Pacific Daylight Time
String strMsk = dateTimeFormat.format(mskTime, timeZoneMsk);    // Friday, 2012 April 06 02:42:59 Moscow Standard Time

この方法には2つの問題があります。

  • あなたが私に尋ねるならば、それはかなり奇妙に見えます。
  • のタイムゾーンmskTimeはまだ-0007です。今後、このオブジェクトをGoogle App Engineデータストアから逆シリアル化すると、問題が発生する可能性があるのではないかと思います。

Dateまたは、カリフォルニアの現地時間の完全な日付で文字列を生成し、文字列のタイムゾーンを置き換えてから、を呼び出して新しい文字列を生成する必要がありDateTimeFormat.parse()ますか?それもかなりハッキーに見えます...

また、 JodaTime for GWTについてどう思いますか?生産には十分安定していますか?

4

1 に答える 1

1

あなたのコードはほぼ正しいように見えます。使用DateTimeFormat.parseすると、カジュアルな読者にとって意図が明確になる可能性があります。タイムゾーンAとB、および1つのオブジェクトが指定されることはめったにありません。また、Bでフォーマットすると、Aでフォーマットすると元のオブジェクトと同じ時刻にDateなる新しいオブジェクトを作成する必要があります。Date

mskTimeのタイムゾーンはまだ-0007です。今後、このオブジェクトをGoogle App Engineデータストアから逆シリアル化すると、問題が発生する可能性があるのではないかと思います。

いいえ、問題はありません。Dateオブジェクトは、タイムゾーンにバインドされていない普遍的な時点を表すことに注意してください。モスクワでは4月6日14:40、カリフォルニアでは4月6日03:40なので、Dateオブジェクトは同じです。

于 2012-04-06T10:44:27.527 に答える