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

我在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)

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

我们解决它

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

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

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

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

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

这种对Date的JS处理是一个很好的翻转。

我在英国……“很容易”,因为我们在格林尼治标准时间(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-08- 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获得偏移…而我的实验似乎certificate你添加了这个,而不是减去它。

更具体

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

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