Javascript Date() 将错误的日期缩短一小时

2022-09-01 09:03:53

我从我的控制器在java中发送此日期()键入的是Spring-MVCmysqldatetime

@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)或夏令时问题。好文章


答案 1

这种JS对日期的处理是一个相当头的翻转。

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

夏季月份:

如果您这样做,将为您提供()“日期2017-08-08T00:00:00.000Z”。new Date( '2017-08-08' )toString

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

在第二种情况下,JS似乎试图通过假设,因为你规定了你指定BST时间的时间,从而“有帮助”。因此,它会调整为 GMT/UTC。否则它不会...尽管(当然)它仍然会产生一个特定的对象,直到毫秒。真是太好了!Date

确认:一个冬季的月份...不应用 BST 时: / : 两者都给出 '日期 2018-01-01T00:00:00.000Z'new Date( '2018-01-01 00:00' )new Date( '2018-01-01' )

至于调整,似乎要撤消自动调整,您只需进行即可

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

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

实际上,如果JS的默认字符串表示形式给出UTC时间,然后是TZ(时区)偏移信息,就像某些ISO日期格式一样,那将更有用:显然,包含此信息。Date


答案 2

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

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

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