【问题标题】:Time Zones in Java / GWT (Client-side)Java / GWT 中的时区(客户端)
【发布时间】:2010-01-28 15:09:30
【问题描述】:

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

【问题讨论】:

  • 没有“使用 GMT 和夏令时的 UNIX 时间(单位)毫秒”的概念。自“纪元”以来经过的毫秒数是固定的,与 GMT 和/或夏令时无关。如果您正在使用夏令时,您可能会输入格式错误的时间字符串和/或忘记精确,或者错误地将您的时间(以毫秒为单位)转换回另一种格式。但是自纪元以来的毫秒数(Java 和 Unix 以及许多其他技术都使用)与 GMT 和夏令时完全无关。
  • OldEnthusiast :这应该是一个答案。
  • 嗯,你肯定会获得今日学究奖。
  • 不是真正的吊坠:'epoch+DST' 不是在 GWT 或任何地方使用的真正时间戳格式。 getTime 按预期返回自 UTC 纪元以来的普通时间;如果 DST/时区正在改变结果,那么其他地方就有问题,例如。在解析步骤中。
  • 是的,我认为这很明显。我不是想更改getTime,而是尝试将 TimeZone 添加到解析中......这只是我正在做的事情。因此问题I need it in UTC. How do I do this?。我会粘贴我已经想出的内容,但我怀疑人们会想要阅读同一事物的 30 种不同组合。

标签: java gwt


【解决方案1】:

您的最后一次编辑让事情变得更加清晰。

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

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 实例所代表的 instant 正是您希望它包含的那一刻。请记住,Date 实例代表时间的瞬间,不适用时区概念:时区用于将瞬间转换为日历元素(天、小时......)并返回。

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

【讨论】:

  • +1 表示清楚并指向DateTimeFormat.format(Date, TimeZone)
  • 哇,这是一个令人困惑的情况。看来你是对的。感谢您提供额外的清晰度:)
【解决方案2】:

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

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

【讨论】:

  • 这是我正在尝试的事情。但是我根本找不到正确的组合。我会认为时区代码是 UTC 的“UTC”?不是 -7:00 加利福尼亚吗?
  • 我添加了"GMT-07:00" 作为示例,您应该更改为适合您的任何值;](这样您就可以获得“使用夏令时的 GMT 的 UNIX 时间毫秒数”;))
【解决方案3】:

反之亦然。 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”。

【讨论】:

  • 我认为 GMT 自动包括夏令时 - 这是我不想要的。我想要普通的 UTC 或正常的 GMT。
  • @_bravado:它没有,这就是为什么英国在夏天使用 BST。
  • 嗯,我不知道你在做什么,但对我来说 - 我告诉 Java 它需要是 GMT 并且它正在使它成为夏令时。所以我再说一遍,它,或者也许你或其他不同意的人关心正确解释他们的答案。
【解决方案4】:

我不断看到建议使用 ZZZZ 的格式...但是为什么呢?

"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 将匹配

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

最后一部分是与 UTC 的偏移量;加利福尼亚(以其他人的示例时间为例)在夏季为 -0800、-0700。

附带说明,GMT 也始终为 -0000。这就是为什么英国的夏令时区是 BST(英国夏令时,+0100)。

【讨论】:

  • 我正在传递从 UTC 文件中提取的时间戳。我将它与您的建议一起传递——它再次将其转换为格林威治标准时间夏令时。要么您没有考虑 GWT 客户端,要么我的 GWT 存在根本问题 - 这是最新版本。
【解决方案5】:

试试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 所指出的,日历 API 目前不可用于 GWT (Issue 603)。虽然这会在 Java 应用程序中获得适当的时间,但它不会在这里工作。 group 中有关于使用 GMT 的信息。

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

【讨论】:

  • 我认为您不能将日历与 GWT 一起使用?
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2011-02-05
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多