【问题标题】:Java Date toString contains a timezone... Why?Java Date toString 包含一个时区...为什么?
【发布时间】:2015-11-04 06:26:49
【问题描述】:

我今天在 VB6 中编写了一些代码,它可以得到自 1970 年 1 月 1 日以来的毫秒数,因此我可以将值发送到 Java 应用程序,该应用程序将解析该值,如 new Date(Long.parse(milliseconds))。我知道 Date(Long) 正在寻找的毫秒数是自 GMT 纪元以来的毫秒数。我正在运行的机器在美国的 CDT 上。当我得到从毫秒解析的日期的 toString 值时,这是我得到的值:

Tue Aug 11 15:40:50 CDT 2015

CDT 就在那里,因为本地机器时区是 CDT?我只是认为 Date 的构造函数会假设从 GMT 纪元以来的毫秒数派生的日期将隐含在本地机器时区中,而不是偏移(在这种情况下)-5 小时,这有点奇怪。

【问题讨论】:

  • 也许我误解了,但您的 VB6 代码似乎更有可能为您提供当前时区的时间

标签: java date vb6


【解决方案1】:

CDT 就在那里,因为本地机器时区是 CDT?

用于显示的时区基于默认时区。

Date 中的毫秒是相对于纪元的,它没有自己的时区。

它是从格林威治标准时间 1970 年 1 月 1 日 00:00 开始拍摄的,或者如果您更喜欢 1969 年 12 月 31 日 17:00 CDT。

将隐含在本地机器时区

使用当地时区仅用于显示目的。使用另一个时区或序列化Date并将其发送到另一个时区的机器,它将再次使用本地时区。

【讨论】:

  • 我正在尝试确定我是否在 VB6 方面做错了什么。我在 DateTime 逻辑上很痛苦:(。在那个应用程序中,我只是获取自纪元以来的毫秒数,然后应用时区偏移量,并将值发送到 java 应用程序。如果我不在 VB6 端应用时区偏移量,我得到的值总是被实际的本地时区偏移量所抵消。我在应用偏移量 VB6 方面是否正确?这似乎给了我正确的值......顺便说一句,两台机器都在同一个 TZ 中。
  • "然后应用时区偏移量," 自纪元以来的毫秒数就是您所需要的,没有要应用的时区偏移量。世界各地的时代都是一样的。
  • 但是当我这样做时,计算出的 Long 值发生在过去 5 小时......我一定是做错了什么。
  • @MarkW 我猜你在做00:00 1/1/1970 CDT,这就是为什么你需要应用时区偏移来获取00:00 1/1/1970 GMT
  • 我最终做的是从 win api 调用中获取 TIME_ZONE_INFORMATION 结构,然后编写一个函数来确定当前时间是美国夏令时间还是标准时间。有了这些信息,我可以通过偏差或偏差 + 日光偏差来抵消它。这解决了我不必做任何奇怪的事情。用 DST 和标准时间测试,一切都很好。再次感谢彼得!
【解决方案2】:

您是正确的,它在 toString() 中显示 CDT,因为您的 locale 表明这是适合您的正确时区。 Date 对象本身并不关心时区,它是一个以毫秒为单位的 Unix 纪元的美化包装。通常,您应该使用toString() 进行调试,并使用a date formatter 向用户实际显示日期(可以选择指定一个明确的时区,而不是由用户的语言环境指定的时区)。

Date.toString() 的Javadoc 仅指定字符串的格式,它实际上并没有说明使用哪个时区。我不会依赖 toString() 在每个 Java 实现中总是返回默认的 Locale。

【讨论】:

    【解决方案3】:

    您可以使用正确的格式来自定义日期表示

    阅读这篇文章,它可能对你有所帮助 Change date format in a Java string

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 2012-09-15
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2017-07-19
      相关资源
      最近更新 更多