使用D3.time.format解析时,date对象返回不同的日期

时间:2013-05-15 00:45:40

标签: javascript syntax d3.js

var startDate = new Date('2013-05-13');
var date_format = d3.time.format("%m/%d");

如果我这样做

startDate = date_format(startDate); 

我得到“05/12”而不是“05/13”。任何人都知道为什么会发生这种情况?

2 个答案:

答案 0 :(得分:5)

请勿使用Date(string) constructor来解析日期;它因浏览器而异。 “2013-05-13”最可能(但不是保证)的解释是UTC时间内的ISO8601字符串。因此,如果您在JavaScript控制台中运行语句,您将看到:

> new Date("2013-05-13")
Sun May 12 2013 17:00:00 GMT-0700 (PDT)

字符串由Date构造在UTC时间解释,而返回的Date对象在本地时间。 5月13日午夜UTC是5月12日下午5点PDT,因此当您使用d3.time.format在当地时间格式化时,您将在5月12日回来。

您可以切换到使用d3.time.format.utc("%m/%d")格式化日期,但是您仍然依赖于Date(字符串)构造函数的模糊行为。所以,相反......

正如@minikomi建议的那样,您可以创建一个d3.time.format来解析日期字符串:d3.time.format("%Y-%m-%d"),然后format.parse("2013-05-13")。或者您可以使用多参数Date构造函数:new Date(2013, 4, 13),但请注意,月份从零开始,而不是通常的。

答案 1 :(得分:2)

使用d3.time.format来解析字符串可能会获得更一致的结果:

  var startDate = '2013-05-13';
  var parser = d3.time.format("%Y-%m-%d");
  var formatter = d3.time.format("%m/%d");

  var startDateString = formatter(parser.parse(startDate));