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

Java/GWT中的时区(客户端),java,gwt,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的。我该怎么做 目前

[客户端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?

尝试该对象

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

编辑:正如bravado所指出的,日历API目前不适用于GWT()。虽然这将在Java应用程序中获得适当的时间,但它在这里不起作用。中有关于使用GMT的信息


EDIT:在Calendar.getInstance()调用中缺少一个右括号

因为GWT不支持
Calendar
类,可能类似这样的黑客行为会奏效:

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();

通过这种方式,您可以提供正确的时区信息——不过,这应该是默认行为。

相反。
Date
实例使用UTC时间刻度(即忽略闰秒)保存自历元以来的时间(以毫秒为单位)。这是
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-04”和冬季的“GMT-05”。

我一直看到建议使用ZZZZ的格式。。。但是为什么呢

“yyyy-MM-dd'HH:MM:ss.SSSZ”将匹配

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

最后一部分是UTC的偏移量;加利福尼亚州(以其他人的时间为例)在夏天将是-0800,-0700


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

你上一次的编辑让事情变得更清楚了

基本上,你是困惑的,你已经得到了你想要的

1239867980191毫秒,从新纪元转换为2009年4月16日星期四格林尼治时间时区的7:46:20.191。同一个瞬间转换为同一天,但在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
实例所代表的时刻正是您希望它包含的时刻。请记住,
Date
实例表示时间上的某个瞬间,而时区的概念并不适用于该瞬间:时区用于将瞬间转换为日历元素(天、小时等)并返回


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

没有“使用GMT和夏令时的UNIX时间(单位:毫秒)”的概念。“历元”后经过的毫秒数是固定的,与GMT和/或夏令时无关。您可能输入了格式错误的时间字符串和/或忘记了使用夏令时或不使用夏令时的精确值,或者错误地将毫秒时间转换回另一种格式。但是自新纪元以来的毫秒数(Java、Unix和许多其他技术都使用)对格林尼治标准时间和夏时制完全不可知。老年爱好者:这应该是一个答案。你肯定会获得“当日学究奖”。不是真正的Pendanty:“epoch+DST”不是GWT或任何地方使用的真正的时间戳格式
getTime
按预期返回UTC纪元以来的普通时间;如果DST/timezone正在更改结果,那么其他地方就会出现问题,例如在解析步骤中。是的,我认为这是显而易见的。我没有试图更改
getTime
,我正在尝试将时区添加到解析中。。。这和我现在做的不一样。因此,问题是
我需要UTC格式。如何执行此操作?
。我会粘贴我已经想到的东西,但是我怀疑人们会想阅读同一东西的30种不同组合。我不认为你可以将日历与GWT一起使用?这就是我一直在尝试的事情。然而,我根本找不到正确的组合。我原以为时区代码是UTC的“UTC”?不是-7:00加利福尼亚还是什么?我添加了
“GMT-07:00”
作为一个例子,您应该更改为对您有效的任何值;](这样您就可以得到“使用GMT和夏令时的UNIX时间毫秒”))我认为GMT自动包括夏令时——这是我不想要的。我想要普通UTC或普通GMT。@_bravado:没有,他说
DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ")
    .parse("2009-10-12T00:00:00.000" + " GMT");