Java / GWT中的时区(客户端)

时间:2010-01-28 15:09:31

标签: java gwt

[客户端GWT类]

我有一个日期对象......

Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
                      .parse("2009-10-12T00:00:00.000);

这很好用。但是,当我这样做时:

dateObject.getTime();

使用具有夏令时的GMT返回UNIX时间毫秒,因此使其成为我无法使用的UNIX时间。我需要它在UTC。我该怎么做?


目前我正在解析一个日期,它正在给我回复:

'Thu Apr 16 08:46:20 GMT+100 2009' @ '1239867980191'

然而,我传递的日期比这个时间少了1小时(7:46而不是8:46!)。

如何传递UTC的事实?或者,如果它不能使用UTC(这将是荒谬的),如何在没有夏令时的情况下使用GMT?

5 个答案:

答案 0 :(得分:5)

你的上一次编辑让事情变得更加清晰。

基本上,你很困惑,你已经得到了你想要的东西。

自从Epoch转换为2009年4月16日星期四,格林威治标准时间区域7:46:20.191以来,该时间为1239867980191毫秒。同一天即转换为同一天,但GMT + 01时区为8:46:20.191。如果您的输入字符串指定为“7:46:20.191”并且您确实从Date.getTime()获得了1239867980191,那么祝贺,解析代码将您的“7:46:20.191”理解为在GMT时区中进行解释,并且它正确。

如果之后打印时得到“8:46:20”,这只是因为您使用GMT + 01时区显示该瞬间。请注意,该字符串包含GMT+100,正好通知您它使用该时区进行显示。 Date实例所代表的 instant 正好是您希望它包含的瞬间。请记住,Date实例表示时间瞬间,不适用时区概念:时区用于将时刻转换为日历元素(天,小时......)并返回。

要将Date转换为可显示的字符串,请使用DateTimeFormat.format(Date, TimeZone),您可以指定要用于该字符串的时区。

答案 1 :(得分:3)

由于GWT不支持Calendar类,可能会出现像这样的hackish:

final String timezone = "GMT-07:00";
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ");
long unix = dtf.parse("2009-10-12T00:00:00" + timezone).getTime();

这样您就可以提供正确的时区信息 - 但这应该是默认行为。

答案 2 :(得分:1)

反过来说。 Date实例使用UTC时间刻度(即忽略闰秒)保存自Epoch以来的时间(以毫秒为单位)。这就是Date.getTime()返回的内容,这就是你想要的。

此处的罪魁祸首是解析器,它解释您在本地时区中作为字符串提供的日期。如果您希望DateTimeFormat将字符串解释为UTC时区中给出的日期和时间,请在解析后的字符串中附加显式时区:

DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ")
    .parse("2009-10-12T00:00:00.000" + " GMT");

(以上假设我正确理解了GWT文档;我没有尝试过。)

请注意我的注释:出于所有实际目的,“GMT”和“UTC”之间没有区别,并且GMT时区没有夏令时。其他时区通常被定义为“GMT加或减一些偏移”,并且偏移可能在夏季和冬季之间变化。例如,纽约的时区有点相当于夏季的“GMT-04”和冬季的“GMT-05”。

答案 3 :(得分:0)

我一直在看ZZZZ的格式......但为什么呢?

“yyyy-MM-dd'T'HH:mm:ss.SSSZ”会匹配

“2009-10-12T00:00:00.000-0000”

最后一部分是与UTC的偏移;加利福尼亚(使用其他人的示例时间)在夏天将是-0800,-0700。

作为旁注,GMT也总是-0000。这就是为什么英国的夏季时区是BST(英国夏令时,+ 0100)。

答案 4 :(得分:-4)

尝试Calendar对象。

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
                  .parse("2009-10-12T00:00:00.000);
cal.setTime(dataObject);
cal.getTimeInMillis();

根据API,getTimeInMillis()返回“从纪元开始的当前时间为UTC毫秒。”

编辑:正如_bravado指出的那样,Calendar API目前不适用于GWT(Issue 603)。虽然这将在Java应用程序中获得适当的时间,但它不会在这里工作。 group中有关于使用GMT的信息。

编辑:在Calendar.getInstance()调用中缺少结束括号