代码之家  ›  专栏  ›  技术社区  ›  trafalgarLaww

在ECMAScript 5中初始化日期的正确方法

  •  1
  • trafalgarLaww  · 技术社区  · 7 年前

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

    以下是我想做的:

    //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() . 我希望得到一个介于 StartTime EndTime . 但我在两个小时内得到的东西比 开始时间 .

    2 回复  |  直到 7 年前
        1
  •  1
  •   Pedro A Sindre Sorhus    7 年前

    字符串(如“2018-02-09T12:00:00.000Z”)是定义日期的标准化方法,由 ISO 8601 .

    有多种方法可以在JavaScript中构造日期对象。从 Date MDN docs ,我们可以看到,实现这一点的方法之一是提供要解析的字符串。甚至还有一个例子:

    var date2 = new Date("1995-12-17T03:24:00");
    

    但你不应该那样做。 该页面警告说,不建议通过解析字符串来创建日期,因为它依赖于实现(即,根据浏览器的不同,其工作方式可能不同)。

    无论如何,重要的是要提到,在ISO 8601中,以字母“Z”结尾的时间戳有一个特殊的含义——它表示,不考虑当地时间,而应该将日期解释为UTC。因此,无论您决定如何构造日期对象,都不要忘记决定是要本地化时间戳还是参考UTC标准时间。

    构建日期对象的安全方法是分别提供参数:

    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);
    

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

        2
  •  1
  •   RobG    7 年前

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

    到目前为止,最可靠的方法是使用带有离散值的日期构造函数。如果您希望为18.02.09 12:00创建日期,则假定为YY。嗯。DD HH:mm使用:

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

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

    强烈建议不要将字符串传递给日期构造函数,原因如下 Why does Date.parse give incorrect results? ,因此不要使用内置解析器,它不可靠,并且可能会得到意外的结果。

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

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