[客户端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?
答案 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()调用中缺少结束括号