Javascript Date()将错误的日期提前一小时

时间:2015-09-09 00:44:27

标签: javascript java jquery

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

datetime

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

当我使用ajax作为[2015-09-30 00:00:00.0]获取此日期时:

1443567600000转换为new Date(1443567600000)

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

我们通过

解决它
Tue Sep 29 2015 23:00:00 GMT+0000 (Maroc)

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我们可能需要更多关于它的数据,但这可能是没有错,这取决于你如何设置和取回你的约会。

基本上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"

答案 2 :(得分:3)

这种对日期的JS处理非常简单。

我在英国......“很容易”,因为我们使用的是GMT(UTC)......除了在夏季,有DST(英国夏令时,BST)。时钟在夏天前进,然后在冬天前进(愚蠢地顺便说一下,但那是另一个问题!)一小时。 3月的一天,格林威治标准时间下午4点现在称为下午5点(BST)。

夏天月:

如果你执行new Date( '2017-08-08' ),这将给你(toString)'日期2017-08-08T00:00:00.000Z'。

如果你new Date( '2017-08-08 00:00' ),那么这将给你'2017-208日期 - 07T23 :00:00.000Z'!

在第二种情况下,似乎JS试图通过假设因为你规定了指定BST时间的小时来“有用”。所以它适应GMT / UTC。否则它不会......但是(当然)它仍会产生一个Date对象,该对象特定于毫秒级。相当糟糕!

确认:冬季月...当未应用BST时: new Date( '2018-01-01 00:00' ) / new Date( '2018-01-01' ):均为“日期2018-01-01T00:00:00.000Z”

至于调整,似乎要撤消自动调整,你只需要

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

...这有点像优素福所写的...除了你必须从有问题的Date获得偏移...而我的实验似乎证明你添加了这个,而不是减去它。

答案 3 :(得分:0)

更具体一点

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

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