D3 DateTime解析器考虑了时区

时间:2015-11-17 11:38:10

标签: javascript date datetime d3.js timezone

我有这个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对象)

1 个答案:

答案 0 :(得分:2)

价值" GMT + 0100(GMT日光时间)"是Windows的有趣说法"英国夏令时" (或,BST)。 In 2009, BST ran from March 29 to October 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's time formatting documentation