我有这个URL,我需要解析mydate
时间戳并将其转换为UTC日期时间(在Javascript中)。
http://www.blablabla.com/#mydate=2009-10-12T22:09:28.000
显然,URL中编码的日期只是字符串,因此它不会传递任何时区信息:但它意味着表示UTC时间。
将UTC时间戳字符串转换为UTC日期时间似乎很简单,但我遇到了这个问题:
我使用D3时间解析器来做这件事,这里的重要部分是:
var iso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%L");
var dateObj = iso.parse(mydate);
mydate
是一个字符串,它只是包含时间戳位的URL的剪辑版本:
2009-10-12T22:09:28.000
.parse
功能的输出为:
Mon Oct 12 2009 23:09:28 GMT+0100 (GMT Daylight Time)
我早就预料到了(这就是我想要的):
Mon Oct 12 2009 22:09:28
操作系统和浏览器设置为UTC时间(此处为GMT)。那么,为什么我得到(GMT夏令时)部分,而不是一个普通的UTC字符串呢?
编辑
即使使用简单的new Date(2009, 9, 12, 22, 09, 28)
,我也会遇到同样的问题(没有D3,没有MomentJS,只有一个普通的JavaScript DateTime对象)
值"GMT+0100(GMT夏令时)"是Windows表示"英国夏令时"(或BST)的有趣方式。2009年,英国夏令时从3月29日到10月25日,因此你的10月12日也在这个范围内。
您的时区未设置为"(UTC) Coordinated Universal Time"
,而是设置为"(UTC) Dublin, Edinburgh, Lisbon, London"
。括号中的值仅表示标准偏移量。它不反映夏令时。
最后,输出实际上是一个Date
对象,而不是字符串。JavaScript Date
对象根据运行它的计算机的时区,以本地时间表示其大部分输出。如果您想要UTC时间,那么您可以使用.toISOString()
而不是.toString()
,尽管它将是ISO 8601扩展格式,而不是人类可读的格式。
如果你想要一个基于UTC的可读格式,因为你已经在使用D3了,那么做如下操作:
var iso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%L");
var dateObj = iso.parse(mydate);
var fmt = d3.time.format.utc("%c"); // or whatever format you wish
var str = fmt.format(dateObj);
有关更多详细信息,请参阅D3的时间格式化文档。