use*_*674 20 javascript timezone datetime date
所以我有iso日期时间需要从字符串转换为日期对象.如何保持日期转换为本地浏览器时区.
new Date('2013-07-18T17:00:00-05:00')
Thu Jul 18 2013 18:00:00 GMT-0400 (EDT)
Run Code Online (Sandbox Code Playgroud)
我想得到
2013年7月18日星期四17:00:00 GMT-0500(XX)
虽然 MomentJS 是一个很棒的库,但它可能无法为每个用例提供解决方案。例如,我的服务器以 UTC 提供日期,并且当日期的时间部分未保存在数据库中时(因为它无关紧要),客户端会收到一个字符串,该字符串的默认时间为全零 - 午夜 - 并以的偏移量+0000
。然后浏览器会根据我的本地时区自动调整并将时间拉回几个小时,结果是前一天。
MomentJs 也是如此。
一种解决方案是切掉字符串的时间部分,然后按照其他答案中的描述使用 MomentJS。
但是如果 MomentJS 不是一个可行的选择会发生什么,即我已经有很多地方使用了 JS Date 并且不想更新这么多行代码?问题是首先如何阻止浏览器根据本地时区转换日期。答案是,当日期为 ISO 格式时,您不能。
但是,并没有规定您传递给 JavaScript 的 Date 构造函数的字符串必须采用 ISO 格式。如果您简单地将-
分隔年、月和日的 替换为/
,您的浏览器将不会执行任何转换。
就我而言,我只是简单地更改了服务器端日期的格式,问题就解决了,而无需使用 MomentJS 更新所有客户端 JS 日期。
请注意,JavaScript 的 Date 类的 MDN 文档在解析字符串以创建 Date 实例时警告不可预测的浏览器行为。
您无法更改 Javascript 的这种行为,因为它是 Javascript 工作的唯一简单方式。发生的事情很简单,Javascript 查看时间偏移,计算匹配的时间戳,然后要求操作系统在本地时区中表示该时间戳。这里要理解的关键是这-05:00
不是时区的指示,而只是与 UTC 的转换。
时区是复杂的野兽,只是任意的政治决定。操作系统提供了一项服务以显示本地时区的时间,但不显示其他时区的时间。为此,您必须考虑诸如 DST 之类的东西,这几乎是地狱。
与时间管理一样,解决这个问题唯一合适的方法是使用专用库。在 Javascript 中,您会发现Moment.js和Moment.Timezone.js非常有用。
示例http://codepen.io/Xowap/pen/XKpKZb?editors=0010
document.write(moment('2013-07-18T17:00:00-05:00').tz('America/New_York').format('LLL'));
Run Code Online (Sandbox Code Playgroud)
作为奖励,您可以从 Moment.js 获得大量格式化/解析功能。
另请注意,只要您使用 ISO 8601,您的日期就可以精确定位到一个精确的时刻,因此可以显示在您喜欢的任何时区。换句话说,JS“转换”你的日期并不重要。
想知道这是否有帮助:
function goAheadMakeMyDate(s){
var d = new Date(s);
// override Date.toString()
d.toString = function(){ return ''+s; };
return d;
}
var example = goAheadMakeMyDate("Fri 19 July 2013 12:00:00 GMT");
example.toString() // returns string actually used to construct the date
'Fri 19 July 2013 12:00:00 GMT'
example.toLocaleString()
'Fri Jul 19 2013 08:00:00 GMT-0400 (EDT)'
1*example // gives seconds since epoch
1374235200000
Run Code Online (Sandbox Code Playgroud)
根据您的输入:
example = goAheadMakeMyDate('2013-07-18T17:00:00-05:00')
{ Thu, 18 Jul 2013 22:00:00 GMT toString: [Function] }
> example.toString()
'2013-07-18T17:00:00-05:00'
> example.toLocaleString() // I live in GMT-4
'Thu Jul 18 2013 18:00:00 GMT-0400 (EDT)'
> 1*example // convert to integer date
1374184800000
Run Code Online (Sandbox Code Playgroud)
但是,如果您开始修改此日期,toString 将不会改变并且会咬住您。