我有一个字符串" 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.
如何正确转换?
答案 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
答案 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中的规定进行解析。主要区别在于:
所以给出:
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)