为什么在Date对象上使用toISOString()方法,与原始日期相比,每小时值提前一小时?

时间:2017-11-10 09:31:23

标签: javascript

我不喜欢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

问题在于执行这个简单的脚本我在ddParsed之间获得了两个不同的小时值,实际上是:

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()方法引起的。

为什么会这样?问题是什么?我错过了什么?我该如何解决?

3 个答案:

答案 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>