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】:
这个对 Date 的 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() 将错误的日期推迟一小时的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 时间戳返回错误的日期 - Javascript