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。