使用步骤时,为什么d3时间范围功能会使值正常化?

时间:2013-08-30 14:10:10

标签: time d3.js

为什么以下范围有效...

d3.time.minute.range(
    new Date('Sat Aug 17 2013 00:00:00 GMT-0400'),
    new Date('Sat Aug 17 2013 06:00:00 GMT-0400'),
    22);

...返回这样的数组......

[
Sat Aug 17 2013 00:00:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 00:22:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 00:44:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 01:00:00 GMT-0400 (Eastern Daylight Time), // << normalized to 1am
Sat Aug 17 2013 01:22:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 01:44:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 02:00:00 GMT-0400 (Eastern Daylight Time), // << normalized to 2am
...
]

......而不是这样?

[
Sat Aug 17 2013 00:00:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 00:22:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 00:44:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 01:06:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 01:28:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 01:50:00 GMT-0400 (Eastern Daylight Time),
Sat Aug 17 2013 02:12:00 GMT-0400 (Eastern Daylight Time),
...
]

我正在尝试渲染时间轴,然后使用d3.time.scale关联像素和时间。在此示例中,每个rect I渲染表示22分钟。当我将.data()绑定到此范围函数的结果时,我的text元素在所有情况下都不能清楚地表示实际时间。

如果我避免使用d3.time.minute.range而只是自己添加22分钟(.getTime() + 22 * 60 * 1000),我会遇到哪些问题?

1 个答案:

答案 0 :(得分:2)

根据mbostock在这里所说的,我认为你需要自己动手: http://grokbase.com/t/gg/d3-js/1344en8cz8/time-scale-always-forcibly-display-first-date-of-a-month

所以:

d3.time.minute.range(
    new Date('Sat Aug 17 2013 00:00:00 GMT-0400'),
    new Date('Sat Aug 17 2013 06:00:00 GMT-0400'))
.filter(function(d) {
    return (d - new Date('Sat Aug 17 2013 00:00:00 GMT-0400')) % (22 * 60 * 1000) == 0;
});

这里小提琴: http://jsfiddle.net/JHTQf/

就问题而言,我认为两者都可以,因为浏览器没有闰秒。我考虑了DST,但我认为这是通过UTC计算确定的。