以下观察到:
以下内容未被观察到:
在格式化某些日期早于特定日期的日期时,我在某些浏览器中发现了一种奇怪的行为。
以下是在夏令时(4月)在巴黎时区完成的:
new Intl.DateTimeFormat('fr').format(new Date(1975, 9, 26)); // returns "25/10/1975"
new Intl.DateTimeFormat('fr').format(new Date(1975, 9, 27)); // returns "27/10/1975"
如您所见,第一行返回的值不正确。所有日期都超过1975-09-26。
有趣的是,1975-09-26是法国的一项直接储蓄变更日期。但为什么特定年份会出现问题?夏令时在1975年之前生效。
如果我们调查时间,我们会遇到同样的问题:
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1975, 9, 26, 2, 0)); // returns "01:00"
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1975, 9, 26, 3, 0)); // returns "03:00"
这不应该发生。格式化的小时应该是Date.getHours()返回的小时。
new Date(1975, 9, 26, 2, 0).getHours() // returns 2
正如在Firefox和Chrome上都观察到的那样,我想知道他们是否使用相同的日期格式化引擎,以及该引擎中是否存在错误。
另外,我想知道是否可以在夏令时的另一个时区再现。
任何人都有任何见解?
编辑:
可能的相关错误:
https://bugs.chromium.org/p/chromium/issues/detail?id=680114 https://bugzilla.mozilla.org/show_bug.cgi?id=1330307
编辑2:
实际上并不总是与旧日期相同的行为。
这个很有意思:
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1900, 2, 26, 2, 0)); // returns 00:09
由small time difference back then解释,以及马特答案中提到的错误。
编辑3:
仅供参考,法国法律规定要在3月和10月的最后一个星期日切换到夏令时。
答案 0 :(得分:0)
您遇到了Windows localtime_s
功能中的错误。它只考虑当前 DST规则,并假设相同的规则始终有效 - 即使有更好的数据可用。
此错误会多次报告为各种浏览器问题。你已经击中了其中两个。您可以在this StackOverflow Q& A。
中看到它的另一个效果