Javascript 如何使用d3.time.scale()生成等距日期数组?

Javascript 如何使用d3.time.scale()生成等距日期数组?,javascript,arrays,date,d3.js,Javascript,Arrays,Date,D3.js,这似乎应该是微不足道的。我想使用d3.time.scale()来获得一个覆盖一定时间范围的等距日期数组。例如,年 [2012-01-01, 2013-01-01, 2014-01-01] 还是几个月 [2012-01-01, 2012-02-01, 2012-03-01 ... 2014-12-01] 或者别的什么 所以我开始是这样的: var t = d3.time.scale() .domain(d3.extent(dates)) .nice(d3.time.year

这似乎应该是微不足道的。我想使用
d3.time.scale()
来获得一个覆盖一定时间范围的等距日期数组。例如,年

 [2012-01-01, 2013-01-01, 2014-01-01]
还是几个月

 [2012-01-01, 2012-02-01, 2012-03-01 ... 2014-12-01]
或者别的什么

所以我开始是这样的:

var t = d3.time.scale()
    .domain(d3.extent(dates))
    .nice(d3.time.year);
然后,我会假设我能做到这一点

var ticks = t.ticks(d3.time.month,1);
…但这只返回一个日期

这给了我一系列的月份

var ticks = t.ticks(30)
…但这仅仅是因为我告诉了它大概要生成多少个滴答声(30),而我事先不知道(除非我自己做一些繁重的工作,否则这会破坏使用d3的目的)

我不明白为什么仅仅告诉它我想要每年、每月、每3个月,或者其他什么都不起作用

我在这里提出了一个问题:

使用Date()构造函数不能可靠地工作——它基本上取决于浏览器。显式解析要安全得多。构造函数不进行这样的分析

而不是

var dates = getDates().map(function(d) { return new Date(d) });
使用以下命令:

var dates = getDates().map(function(d) {
    return d3.time.format("%Y-%m-%d").parse(d);
});

使用以下数据集修改JSFIDLE.

var dataset = [ 
      { "active" : false,
        "date" : "2014-12-12"
      },
      { "active" : true,
        "date" : "2014-12-13"
      },
      { "active" : true,
        "date" : "2014-12-14"
      },
      { "active" : true,
        "date" : "2014-12-15"
      }
    ]

var slicedData = var slicedData = dataset.slice();
我也有类似的问题,我发现

var x = d3.time.scale()
    .domain([new Date(slicedData[0].date), new Date(slicedData[slicedData.length - 1].date)])
    .range([0,width]);
放弃了量表中的第一项(为什么会这样仍然是个谜),而

很好


所以,我唯一的解释就是拉尔斯提供的。Date()是不可预测的,因此请改用d3.time.format。

只是澄清一下,我不会将其与axis对象结合使用。我只想要一个数组。我原来的小提琴链接是错误的-你能看看现在的吗?这是可行的,尽管我不完全清楚为什么。我正在分析日期,但我使用的是
newdate(d)
,而您使用的是
d3.time.format(“%Y-%m-%d”).parse(d)
。据我所知,它们都创建了普通的
Date
对象,但您的对象的时间已归零,而我的对象返回以本地时区表示的时间。我不确定(a)为什么对日期的解析不同,或者(b)为什么这会对d3造成如此大的差异。使用
Date()
构造函数不能可靠地工作——它基本上取决于浏览器。显式解析要安全得多。构造函数没有这样解析。好吧,如果你不介意的话,我会编辑你的答案,让你明白。
var dates = slicedData.map(function(d) {
        return d3.time.format("%Y-%m-%d").parse(d.date);
    });
    var t = d3.time.scale()
        .domain(d3.extent(dates))
        .range([0,width])
        .nice(d3.time.day);