var startDate = new Date('2013-05-13');
var date_format = d3.time.format("%m/%d");
如果我这样做
startDate = date_format(startDate);
我得到“05/12”而不是“05/13”。任何人都知道为什么会发生这种情况?
答案 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));