1

如何将在本地时区创建的 Date 对象的时区转换为目标时区?

这是我需要的。我希望网络客户端使用DatePicker选择一个日期,但生成的 Date 对象应该看起来就像是在另一个 timezone 中选择的。由于没有办法告诉DatePicker我必须手动更改日期。

例如,现在是加利福尼亚州 2012 年 4 月 6 日凌晨 2:42。创建日期将采用 UTC-7 时区。我想在欧洲/莫斯科时区使用 2012 年 4 月 6 日凌晨 2:42 的日期对象。

这是我现在做的:

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

这种方法有两个问题:

  • 如果你问我,这看起来很奇怪。
  • 时区mskTime仍然是-0007。我想知道当我从 Google App Engine 数据存储区反序列化这个对象时,它是否会导致任何问题。

或者我应该只生成带有本地加利福尼亚时间的完整日期的字符串,替换字符串中的时区,然后Date通过调用生成新的DateTimeFormat.parse()?它看起来也很hacky...

另外,您如何看待JodaTime for GWT?生产是否足够稳定?

4

1 回答 1

1

您的代码看起来正确。使用DateTimeFormat.parse可能会使不经意的读者更清楚地表达意图。给您时区 A 和 B 以及一个对象的情况并不常见,Date您必须生成一个新Date对象,当在 B 中格式化时,它与在 A 中格式化时的原始对象具有相同的时间。

mskTime 中的时区仍然是 -0007。我想知道当我从 Google App Engine 数据存储区反序列化这个对象时,它是否会导致任何问题。

不,不可能有问题。请记住,Date对象表示不受时区约束的通用时间点。莫斯科是 4 月 6 日 14:40,加利福尼亚是 4 月 6 日 03:40,所以Date对象是相等的。

于 2012-04-06T10:44:27.527 回答