java - 1° 夏令时 Java 和 JS 表现出不同的行为

标签 java javascript dst

假设巴西利亚 GMT -0300:夏令时于 21/10/2012 00:00:00,此时时钟应提前一小时

Java

new Date(2012 - 1900, 9, 21, 0, 0, 0)
Sun Oct 21 01:00:00 BRST 2012

Chrome/FireFox(控制台)

new Date(2012, 9, 21, 0, 0 ,0)
Sat Oct 20 2012 23:00:00 GMT-0300 (Hora oficial do Brasil)

Java 中的结果是我所期望的,但是 JS 中的结果我无法理解。我找到了这个post比约德说

This is an absolutely correct behavior

但没有解释为什么这种行为是可以的。

我的问题是:

为什么 JS 返回一小时前的日期?

附注我知道 Date 被标记为“弃用”,但我正在使用 GWT;日期是我唯一的选择。

最佳答案

基本上,据我所知,这个答案是不正确的。我什至对 Java 版本也不是完全满意。

从根本上来说,您正在尝试构建一个从未发生过的本地日期/时间。从本地时间转换为 UTC 总是很棘手,因为存在三种可能性:

  • 明确的 map ,在大多数时区,每年只有两个小时除外
  • 不明确的映射,在向后过渡期间,相同的本地时间段出现两次(例如本地时间为 12:59am、1am、...1:59am、1am、1:59am,凌晨 2 点)
  • “间隙”映射,其中根本不存在本地时间段(例如本地时间为凌晨 12:59、凌晨 2 点、凌晨 2:01)

巴西在午夜将时钟向前拨动,因此本地时间实际上是这样的:

October 20th 11:58pm
October 20th 11:59pm
October 21st 01:00am
October 21st 01:01am

您所要求的本地时间根本就没有发生。看起来 Java 只是假设您想将其向前滚动...而 JavaScript 却变得很困惑:( 如果您要求 2013 年 2 月 16 日开始的午夜,JavaScript 结果会更容易理解(但仍然不正确),因为例如 - 时钟会回到 15 日晚上 11 点。16 日上午 12 点是明确的,因为它只能发生在 15 日“第二个”晚上 11 点至晚上 11:59 之后。

一个好的日期/时间 API(在我非常有偏见的观点中)会迫使您说出在进行转换时您希望如何发生歧义和间隙。

关于java - 1° 夏令时 Java 和 JS 表现出不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048281/

相关文章:

Java:将字符转换为字符串

java - 如何使可变对象列表不可变

javascript - IFrame 或嵌套 IFrame 中 Javascript、HTML 和 CSS 的兼容性

javascript - 使用 jquery 自定义自动完成

javascript - 如何在 Oracle Apex 5.1 中动态添加一个或多个文本框到一个区域?

python - 在 Pandas 中,将 tz_localize 用于忽略 DST 的时间序列的最佳方法是什么?

c++ - 使用 dst with boost 将当前服务器时间转换为时区

Azure 数据工厂考虑 DST 转换时间戳

java - 为什么 Sun/Oracle 在 Java 7/JDK7 中选择 Unicode 5.1 而不是 Unicode 5.2?

java - SQLite异常: No such table even if there is table