Javascript Date() 将错误的日期推迟一小时

Posted

技术标签:

【中文标题】Javascript Date() 将错误的日期推迟一小时【英文标题】:Javascript Date() give wrong date off by one hour 【发布时间】:2015-12-04 19:34:40 【问题描述】:

我在 java (Spring-MVC) 中从我的控制器发送此日期,mysql 中的类型是 datetime

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "..") public Date getYy()  
    return this.yy; 

作为:[2015-09-30 00:00:00.0]

当我使用 ajax 作为 1443567600000 得到这个日期时:

new Date(1443567600000) 转换为Tue Sep 29 2015 23:00:00 GMT+0000 (Maroc)

那为什么我的约会错了一小时呢?

解决方案

我们解决它

d = new Date(value) ;
d.setTime( d.getTime() - new Date().getTimezoneOffset()*60*1000 );

因为这是夏令时 (DST) 或夏令时问题。好article

【问题讨论】:

时区问题?如何 ?为什么其他日期还可以? 我不能使用0:00:00.1我从mysql数据库获取日期 问题名称有点误导。它关闭了小时,而不是 @Haketo 那为什么? mysql中的类型是datetime,java中的类型是@Temporal(TemporalType.TIMESTAMP) @Column(name = "..") public Date getYy() return this.yy; 如何将2015-09-30 00:00:00.0 转换为时间戳 【参考方案1】:

这个对日期的 JS 处理是一个非常令人头疼的事情。

我在英国...“轻松”,因为我们在 GMT (UTC)...除了夏季月份,当有 DST(英国夏令时,BST)时。时钟在夏天往前走,在冬天往前走(顺便说一句,这很愚蠢,但这是另一个问题!)一小时。三月的一天,格林威治标准时间下午 4 点现在称为下午 5 点(英国夏令时)。

夏季月份:

如果你这样做new Date( '2017-08-08' ),这会给你 (toString) 'Date 2017-08-08T00:00:00.000Z'。

但是,如果您使用 new Date( '2017-08-08 00:00' ),这将为您提供“日期 2017-08-07T23:00:00.000Z”!

在第二种情况下,似乎 JS 试图通过假设因为您规定了指定 BST 时间的小时来“提供帮助”。因此它会调整为 GMT/UTC。否则它不会......虽然(当然)它仍然会产生一个Date 对象,该对象精确到毫秒。真是个难题!

确认:冬季月...未应用 BST 时: new Date( '2018-01-01 00:00' )/ new Date( '2018-01-01' ): 都给出 'Date 2018-01-01T00:00:00.000Z'

至于调整,看来要撤消自动调整就行了

jsDate.setTime( jsDate.getTime() + jsDate.getTimezoneOffset() * 60 * 1000 );

...这有点像 Youssef 写的...除了您必须从有问题的特定Date 获得偏移量...而且我的实验似乎证明您添加了这个,而不是减去它.

真的,如果 JS Date 的默认字符串表示给出 UTC 时间后跟 TZ(时区)偏移信息,就像某些 ISO 日期格式一样:显然,包含此信息.

【讨论】:

这能解释为什么“2020-01-01 00:00”显示“2019-12-31 23:00”吗?不知何故,在我的应用程序上,日期显示了迟到一小时的版本(即使日志起初没有显示它,看到真实的比较也令人不安),因此相当于 .toISOString() 但使用我的浏览器控制台,我得到了 toString() 格式控制台何时记录日期?【参考方案2】:

我们可能需要更多关于它的数据,但这里可能没有任何问题,这取决于你如何设置和取回你的日期。

基本上1443567600000 不包含时区。它代表来自格林威治的Tue Sep 29 2015 23:00:00。这是一个时间点,当然,它不同于任何具有不同时区的位置。同一时刻,发生在不同的时间(GMT+1 的午夜是 GMT 的晚上 11 点)。

您必须将时间和时区都存储在您的数据库中,并可能发送回 JS,否则它的解释总是会因客户端的本地时间而有所不同。

举个例子:

var d = new Date(2015, 8, 30);
console.log(d.toJSON()); // In my case I got "2015-09-29T22:00:00.000Z"
console.log(d.toDateString()); // "Wed Sep 30 2015"

【讨论】:

【参考方案3】:

我想这可能是一个夏令时问题。您可以检查客户端的时区和服务器的时区。 (网络服务器或 SQL Server)

【讨论】:

但是无论客户的时区是什么,我该如何解决我的问题? 你可以阅读这个article 谢谢,这是一个夏季时间 (DSL) 问题,所以我们像这样解决它d = new Date(value) ; d.setTime( d.getTime() - new Date().getTimezoneOffset()*60*1000 ); @Youssef 您的解决方案似乎不太正确。 new Date() 会给你日期时间现在,而不是d。所以你必须去d.getTimezoneOffset()*60*1000 ...我想。【参考方案4】:

更具体的

 time = new Date("2018-06-01 " + time);
            var offset = time.getTimezoneOffset();
            offset = Math.abs(offset / 60);
            time.setHours(time.getHours() + offset);

在这种情况下,时间等于带前导零的小时:带前导零的分钟。 这会将小时差添加到 UTC。 如果您将字符串传递到日期,则将其视为 UTC。

【讨论】:

以上是关于Javascript Date() 将错误的日期推迟一小时的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 获取和设置日期

谈谈javascript中的日期Date对象

Firebase 时间戳返回错误的日期 - Javascript

javascript-封装Date日期类

将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天

javascript Date format(js日期格式化)