Javascript D3.js:time.scale.utc()似乎对我没有任何帮助?

Javascript D3.js:time.scale.utc()似乎对我没有任何帮助?,javascript,d3.js,Javascript,D3.js,我试图使用d3.time.scale.utc()生成一个在任何设备上都相同的时间刻度,如图所示 但是,以下两种刻度似乎都会生成本地格式的刻度日期——在我的例子中,返回的日期使用的是BST和GMT: var start = new Date("Mon Oct 21 2013 00:00:00 GMT+0000 (BST)"); var end = new Date("Mon Dec 02 2013 00:00:00 GMT+0000 (GMT)") var x = d3.time.scale.u

我试图使用
d3.time.scale.utc()
生成一个在任何设备上都相同的时间刻度,如图所示

但是,以下两种刻度似乎都会生成本地格式的刻度日期——在我的例子中,返回的日期使用的是BST和GMT:

var start = new Date("Mon Oct 21 2013 00:00:00 GMT+0000 (BST)");
var end = new Date("Mon Dec 02 2013 00:00:00 GMT+0000 (GMT)")

var x = d3.time.scale.utc()
    .domain([start, end])
    .range([0, 800])
    .ticks(d3.time.mondays, 1);
console.log(x);

var y = d3.time.scale()
    .domain([start, end])
    .range([0, 800])
    .ticks(d3.time.mondays, 1);
console.log(y);
我如何要求D3生成未设置为本地时区的我勾选日期


在这里摆弄:

问题很简单,就是您正在将日期对象记录到控制台,而您的浏览器正在对这些对象应用默认格式以将其转换为本地时区

使用
d3.time.scale.utc()
不会更改日期对象。自1970年以来,Javascript日期对象始终以毫秒数存储在内部

UTC刻度的独特之处在于该功能,默认情况下使用。但是,只有当您实际将记号作为标签绘制时,记号格式函数才不会影响控制台的日志记录

下面的fiddle实际上使用每个刻度的刻度格式化功能来格式化记录到控制台的日期对象:

但是,您会发现另一个问题(假设您不在GMT时区)。时间刻度的默认格式功能是多格式:如果值不是午夜,它将返回时间而不是日期。当您将滴答声指定为
mondays
时,它仍然会将其计算为当前时区的午夜周一,对我来说,这是UTC的6或7个小时

这就是为什么所有时间间隔函数都有UTC版本的原因。将滴答声规范更改为

var xTicks =  xScale.ticks(d3.time.mondays.utc, 1);
获取要在UTC午夜落下的刻度值:


尽管如此,您可能仍然需要指定一个自定义的tick格式化程序。当您仅在星期一扫描多个月时,星期日+月日格式实际上不起作用。

在小提琴中,它们返回的是GMT时间,与UTC时间相同。检查。有一条关于GMT与UTC相同的注释。因此,“转换”对D3可能没有意义。谢谢,但fiddle中的tick函数返回的第一个项目是返回BST,这肯定与UTC不一样……我从控制台输出中得到了这一点:2013年10月21日星期一00:00:00 GMT-0400(EDT)。我猜这是您的本地时区。您是否将其作为
x
y
中的第一项?如果是这样的话,那么
utc()
就没有达到我的预期。你说得对。它们是一样的。查看文档中可能的默认值。谢谢,阿米莉亚。我将techan与d3一起使用,这使我正确地添加了
utc()
方法,如这些示例中的
techan.scale.financetime.utc()
所示:。对于最近发现这个答案的人来说,d3的更高版本似乎对刻度、时间格式和时间间隔使用了不同的语法(请参见
d3.scaleTime()
d3.scaleUTC()
var xTicks =  xScale.ticks(d3.time.mondays.utc, 1);