在EcmaScript5中初始化Date的正确方法

时间:2018-01-27 19:45:57

标签: javascript date initialization ecmascript-5

在EcmaScript5中初始化Date的正确方法是什么。

以下是我要做的事情:

//18.02.09 12:00 - 18.02.11 24:00
 var StartTime = new Date("2018-02-09T12:00:00.000Z").getTime();
 var EndTime = new Date("2018-02-11T23:59:00.000Z").getTime();

我在这里做错了什么?

我正在将笔记本电脑上的时间更改为18.02.09 12:01 PM。然后我打电话给new Date().now()。我期望获得一个介于StartTimeEndTime之间的数字。但是我在两小时内得到的东西少于StartTime

2 个答案:

答案 0 :(得分:1)

" 2018-02-09T12:00:00.000Z"等字符串;是ISO 8601给出的定义日期的标准化方法。

在JavaScript中构建Date对象有多种方法。从Date MDN docs,我们可以看到其中一种方法是提供要解析的字符串。甚至有一个例子:

new Date(year, month);
new Date(year, month, day);
new Date(year, month, day, hours);
new Date(year, month, day, hours, minutes);
new Date(year, month, day, hours, minutes, seconds);
new Date(year, month, day, hours, minutes, seconds, milliseconds);

但你不应该这样做。同一页警告不建议通过解析字符串来创建Date,因为它是依赖于实现的(即根据浏览器的不同,它可能会有所不同)。

无论如何,重要的是要提到在ISO 8601中,用字母" Z"结束时间戳。具有特殊含义 - 它表示不应考虑当地时间,而应将日期解释为UTC。因此,无论您如何决定构建Date对象,都不要忘记决定是将本地时间戳本地化还是引用UTC标准时间。

构造Date对象的一种安全方法是单独提供参数:

$products = getProductsFromApi();
foreach ($products as $key => $product) {
    $this->import($product);
}

您还可以考虑使用名为MomentJS的强大库,在撰写本文时其大小为16.3 kB(绝对值得考虑),这是非常着名和广泛使用的,每月下载量超过1200万次(在撰写本文时)。

答案 1 :(得分:1)

创建Date有很多种方法,可以传递单个字符串,单个整数或多个参数。最好的方法取决于您的具体情况。

到目前为止,最强大的方法是使用具有离散值的Date构造函数。如果您希望创建一个18.02.09 12:00的日期,那么假设它是YY.MM.DD HH:mm使用:

var d = new Date(2018, 1, 9, 12);

这将创建2018年2月9日当地时间中午12点的日期,其中“本地”由主机系统时区偏移确定。

强烈建议将字符串传递给Date构造函数,原因是Why does Date.parse give incorrect results?的答案中表达的原因,所以不要使用内置的解析器,它不可靠,你可能会得到意想不到的结果。

字符串“2018-02-09T12:00:00.000Z”将被视为UTC,因此从其创建的日期将被主机本地偏移量抵消。使用UTC时差将与主机时区偏移在两个日期发生变化的本地时差不同,例如:跨越夏令时边界的地方。

因此,“正确”或“最佳”方式在很大程度上取决于您要做的事情,输入值和您希望实现的结果。底线永远不会使用内置解析器,总是使用定制函数或使用库手动解析字符串。