我不喜欢JavaScript,过去我总是使用MomentJS库来处理日期。
此时(出于某种原因)我不能使用第三方库,只能使用纯旧的JavaScript,我发现以下困难。
在我的代码中,我有类似的东西:
d = new Date();
console.log("d: " + d);
dParsed = d.toISOString().replace(/[T|Z]/g, ' ').replace(/\.\d+/, '').trim();
console.log("dParsed: " + dParsed);
我使用dParsed
字符串使用以下格式保存d
日期的值:YYYY-MM-DD HH-MM-SS
问题在于执行这个简单的脚本我在d
和dParsed
之间获得了两个不同的小时值,实际上是:
d: Fri Nov 10 2017 10:24:57 GMT+0100 (ora solare Europa occidentale)
VM336:5 dParsed: 2017-11-10 09:24:57
正如您在解析后所看到的那样,dParsed
的小时是09而不是10.结果是一小时前。在我看来,这种行为是由toISOString()
方法引起的。
为什么会这样?问题是什么?我错过了什么?我该如何解决?
答案 0 :(得分:3)
toISOString方法生成ISO8601格式的字符串,该字符串始终位于UTC零时区。
另一方面,当您创建Date
对象时,它会使用浏览器/ OS的当前时区创建。在您的情况下似乎是GMT+1
- 所以它比UTC
晚一小时。
这两个日期代表相对于UTC的相同时刻,但相对于他们测量的时区的不同小时数。
作为一般规则,时间的每个内部使用应该相对于UTC
,而时区或夏令时的意识应该是一个"视图"问题。
一个修复方法是在UTC时区中创建d
。这样做的方法是d = new Date(Date.now())
。
答案 1 :(得分:1)
如下所示
d: Fri Nov 10 2017 10:24:57 GMT+0100 (ora solare Europa occidentale) VM336:5
dParsed: 2017-11-10 09:24:57
您的原始日期包含时区GMT+0100
,这意味着它比GMT提前1小时,但在toISOString()
中,时区始终为零(0)因此您不需要额外的1小时在你原来的时间。
请参阅MDN的toISOString()
定义
The toISOString() method returns a string in simplified extended ISO format (ISO 8601), which is always 24 or 27 characters long (YYYY-MM-DDTHH:mm:ss.sssZ or ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectively). The timezone is always zero UTC offset, as denoted by the suffix "Z".
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
答案 2 :(得分:1)
dParsed中的日期是UTC时区(您要替换的“Z”),而另一个是您当地时区“GMT + 0100(ora solare Europa occidentale)”
编辑:您必须编写自己的函数来获取本地格式化的时间字符串
function toLocaleISOString(date) {
function pad(number) {
if (number < 10) {
return '0' + number;
}
return number;
}
return date.getFullYear() +
'-' + pad(date.getMonth() + 1) +
'-' + pad(date.getDate()) +
'T' + pad(date.getHours()) +
':' + pad(date.getMinutes()) +
':' + pad(date.getSeconds()) ;
}
document.getElementById("result").innerHTML = toLocaleISOString(new Date())
<div id="result"></div>