GWT DateTimeFormat反转时区值

时间:2011-02-21 16:47:33

标签: java datetime gwt date timezone

考虑以下代码在GWT中运行:

import com.google.gwt.i18n.client.DateTimeFormat;
...
DateTimeFormat fullDateTimeFormat = DateTimeFormat.getFullDateTimeFormat();
Log.info(fullDateTimeFormat.format(date, TimeZone.createTimeZone(-120)));
Log.info(fullDateTimeFormat.format(date, TimeZone.createTimeZone(0)));
Log.info(fullDateTimeFormat.format(date, TimeZone.createTimeZone(180))); 

假设格林威治时间是16:00。

为什么我会得到以下输出?

Monday, February 21, 2011 6:00:00 PM Etc/GMT-2
Monday, February 21, 2011 4:00:00 PM Etc/GMT
Monday, February 21, 2011 1:00:00 PM Etc/GMT+3

预期的是

Monday, February 21, 2011 2:00:00 PM Etc/GMT-2
Monday, February 21, 2011 4:00:00 PM Etc/GMT
Monday, February 21, 2011 7:00:00 PM Etc/GMT+3

解决问题的正确方法是什么?

2 个答案:

答案 0 :(得分:8)

“Etc / GMT-2”实际上(并且非常令人惊讶地)“+ 02:00”,见http://en.wikipedia.org/wiki/Tz_database#Area

  

为了符合POSIX风格,那些以“Etc / GMT”开头的区域的标志与大多数人的期望相反。在这种风格中,格林威治标准时间以西的区域有一个正号,东方区域有一个负号。

您的代码会在我的计算机上导致不同的输出(可能是因为我的语言环境不同):

Monday, 2011 February 21 18:00:00 UTC+2
Monday, 2011 February 21 16:00:00 UTC
Monday, 2011 February 21 13:00:00 UTC-3

所以,负责倒车的不是DateTimeFormat,而是TimeZone.createTimeZone(int timeZoneOffsetInMinutes)


让我们再看看com.google.gwt.i18n.client.TimeZone的GWT javadocs:

getOffset(Date date)

* Returns the RFC representation of the time zone name for the given date.
* To be consistent with JDK/Javascript API, west of Greenwich will be
* positive.

composeGMTString(int offset)

* In GMT representation, +/- has reverse sign of time zone offset.
* when offset == 480, it should output GMT-08:00.

答案 1 :(得分:0)

我看了一下源代码。它有评论说

  

20:00 GMT0000,或16:00 GMT-0400,或12:00 GMT-0800

都是一样的。据此我推断出时间和时区之间的关系是从GMT中减去或加到GMT的时间量。因此格林尼治标准时间16.00变为1400 GMT -0200或1900 GMT +0300。记住这一点,我们必须以相反的方式工作才能获得理想的结果。