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

时间:2017-01-05 07:15:42

标签: javascript date datetime

我有一个字符串" 2017-01-05T15:03:25.21"这已经是我时区的确切时间了。 (例如:+8) 如何将此字符串转换为日期对象? 问这个的原因是,Date类似乎接受了一个&#;; UTC日期字符串'只要。如果我直接这样做:

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

//myDate will have another redundant time-zone offset.

如何正确转换?

3 个答案:

答案 0 :(得分:2)

您可以将时区添加到字符串末尾,如下所示:

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.22</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.20</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.21</version>
    </dependency>
</dependencies>

您可以在此处阅读有关有效日期格式的更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

https://www.w3.org/TR/NOTE-datetime

答案 1 :(得分:2)

  

如何正确转换?

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

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

将于2017年1月5日3:03:25.21 PM在当地时区生成日期。

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

var myDate = fecha.parse(strDateTime, "YYYY-MM-DDTHH:mm:ss.SS")

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

  1. 仅限日期的表格,如&#34; 2016-12-12&#34;被解析为UTC而不是本地
  2. 只有&#34; 简化ISO 8601扩展格式&#34;支持,详见ECMA-262 §20.3.1.6 Date Time String Format
  3. 所以给出:

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

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

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

    //myDate will have another redundant time-zone offset.
    

    不正确。主机时区设置将用于确定用于计算UTC时间值的偏移量,还用于计算 get * 方法返回的本地值,例如 getFullYear getMonth getDate getHours 等。

    字符串&#34; 2017-01-05T15:03:25.21&#34;在偏移量为+0800的系统上将生成时间值1483599805210,表示2017-01-05T07:03:25.21Z(即UTC + 0000)。

    如果您希望向不同时区的客户发送代表特定时刻的时间戳,则应满足以下条件之一。

    将时区附加到字符串:

    2017-01-05T15:03:25.21+0800
    

    使用UTC等效项:

    2017-01-05T07:03:25.21Z
    

    使用时间值:

    1483599805210
    

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

答案 2 :(得分:0)

这应该有效

var strDateTime = "2017-01-05T15:03:25.21";
var myDate = new Date(strDateTime.replace('T', ' '));

我的时区输出: 2017年1月5日星期五15:03:25 GMT + 0200(EET)