如何将非UTC日期字符串转换为Date对象?

zer*_*law 5 javascript datetime date

我有一个字符串“ 2017-01-05T15:03:25.21”,它已经是我所在时区的确切时间。(例如:+8)如何将此字符串转换为Date对象?提出此问题的原因是,Date类似乎仅接受“ UTC日期字符串”。如果我直接这样做:

var strDateTime = "2017-01-05T15:03:25.21";
var myDate = new Date(strDateTime);

//myDate will have another redundant time-zone offset.
Run Code Online (Sandbox Code Playgroud)

如何正确转换呢?

Rob*_*obG 2

\n

如何正确转换这个?

\n
\n\n

与 ECMAScript ed 5 (ES5) 及更高版本一致的实现将使用 Date 构造函数或 Date.parse 正确解析字符串,因此:

\n\n
var strDateTime = "2017-01-05T15:03:25.21";\nvar myDate = new Date(strDateTime);\n
Run Code Online (Sandbox Code Playgroud)\n\n

将生成本地时区 2017 年 1 月 5 日下午 3:03:25.21 的日期。

\n\n

但是,考虑到实现之间解析的普遍不一致,不建议这样做。应该使用自定义函数或库,例如使用fecha.js

\n\n
var myDate = fecha.parse(strDateTime, "YYYY-MM-DDTHH:mm:ss.SS")\n
Run Code Online (Sandbox Code Playgroud)\n\n

从 ES5 及更高版本开始,ISO 8601 日期和时间字符串主要按照 ISO 8601 中的指定进行解析。主要区别是:

\n\n
    \n
  1. Date\xe2\x80\x93only 形式如“2016-12-12”被解析为 UTC 而不是本地
  2. \n
  3. 仅支持“ ISO 8601 扩展格式的简化”,详见ECMA-262 \xc2\xa720.3.1.6 日期时间字符串格式
  4. \n
\n\n

所以给出:

\n\n
var s = "2017-01-05T15:03:25.21";\nvar d = new Date(s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后d将根据主机系统时区设置转换为具有 UTC 时间值的日期。如果您的主机设置为 UTC+0800,则这就是应用的时区。

\n\n

日期对象没有时区。它们所拥有的只是一个时间值,表示自 1970-01-01T00:00:00Z 以来的毫秒数。任何相关时区信息均来自主机。所以评论:

\n\n
//myDate will have another redundant time-zone offset.\n
Run Code Online (Sandbox Code Playgroud)\n\n

是不正确的。主机时区设置将用于确定用于计算 UTC 时间值的偏移量,并用于计算get*方法(如getFullYeargetMonthgetDategetHours等)返回的本地值。

\n\n

偏移量为+0800的系统上的字符串“2017-01-05T15:03:25.21”将生成时间值1483599805210,它代表2017-01-05T07:03:25.21Z(即UTC+0000)。

\n\n

如果您希望向不同时区的客户端发送代表特定时刻的时间戳,则应使用以下选项之一。

\n\n

将时区附加到字符串:

\n\n
2017-01-05T15:03:25.21+0800\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 UTC 等效值:

\n\n
2017-01-05T07:03:25.21Z\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用时间值:

\n\n
1483599805210\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一个通常是首选,因为new Date(timevalue)所有实现都支持它,它是明确的并且可以轻松转换以在其他系统中使用。

\n