Javascript Date()给出错误的日期一个小时

Javascript Date() give wrong date off by one hour

本文关键字:一个 日期 小时 错误 Date 出错 Javascript      更新时间:2023-09-26

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

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

as: [2015-09-30 00:00:00.0]

当我得到这个日期与ajax作为1443567600000:

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

那为什么我把日期搞错了一个小时呢?

<

解决方案/strong>

我们用

解析
d = new Date(value) ;
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

因为它是夏令时(DST)或夏令时的问题。篇好文章

我想也许这是一个夏令时的问题。您可以检查客户端的时区和服务器的时区。(web server或SQL server)

这个JS对Date的处理是一个相当大的翻转。

我在英国…"easy"因为我们用的是格林尼治标准时间(UTC)…除了在实行夏令时(英国夏令时)的夏季。时钟在夏天向前走一小时,在冬天向后走一小时(顺便说一句,这是另一个问题!)。3月的某一天,格林尼治时间下午4点现在被称为 5pm (BST)。

夏天

:

如果你做new Date( '2017-08-08' ),这将给你(toString)"日期2017 - 08年- 08 - t00:00:00.000z"。

但是,如果您执行new Date( '2017-08-08 00:00' ),则会得到"日期2017-08-07T23:00:00.000Z"!

在第二种情况下,JS似乎试图成为"有帮助的";假设因为你规定了时间你指定的是英国夏令时。所以它调整为GMT/UTC。否则它不会…尽管(当然)它仍然会产生一个精确到毫秒的Date对象。真是抓到你了!

确认:a winter month…当不采用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 );

…这有点像优素福写的……除非你必须从特定的Date中获得偏移量…我的实验似乎证明了这是加法,而不是减法。

如果JS Date的默认字符串表示给出UTC时间后跟TZ(时区)偏移信息,就像一些ISO日期格式一样,这将会更有帮助:显然,包含了此信息。

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

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

你必须在DB中存储时间和时区,并可能发送回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"

更具体地说

 time = new Date("2018-06-01 " + time);
            var offset = time.getTimezoneOffset();
            offset = Math.abs(offset / 60);
            time.setHours(time.getHours() + offset);
在这种情况下,

等于带前导零的小时和带前导零的分钟。这将把小时差添加到UTC。如果你传递一个字符串给date,它将被视为UTC。