如何在我的 d3 时间格式数据中包含时区?

How do I include a timezone in my d3 time formatted data?

我正在使用 d3 v4。我的 x 轴数据包含以毫秒为单位的时间(自 1970 年以来)。我想将其显示为东部标准时间,例如

08/09/17 5:20 PM EDT

所以我试过了

focus.select("text").text(d.value).append("tspan")
      .attr("x", 10).attr("dy", "1.5em").text(d3.timeFormat("%m/%d/%Y %H:%M %p %Z+5")(d.index_date));

但不幸的是它显示为

08/09/17 5:20 PM -0500 +%

将 date/time 格式化为 EDT(美国东部标准时间)的正确方法是什么?

常规 javascript 日期对象的 toString() 方法包含时区缩写,但 d3-time-format 库似乎没有包含获取它的方法。

var date = new Date(123456789);
console.log(date.toString()); //"Fri Jan 02 1970 05:17:36 GMT-0500 (EST)"

var d3Format = d3.timeFormat("%c %Z");
console.log(d3Format(date)); //"1/2/1970, 5:17:36 AM -0500"

因此您必须使用自己的函数手动添加时区缩写。

var jenny = new Date(8675309);
var d3Format = d3.timeFormat("%c"); //%c is shorthand for %x %X (date and time)

// Add "EST" to the end of every string
var addEST = function(date) {
    return d3Format(date) + " EST";
}

console.log(addEST(jenny)); //"12/31/1969, 9:24:35 PM EST"

D3 v4 time format 支持自定义语言环境,但我没有看到任何时区信息(因此您可以用俄语显示日期时间,但只能使用浏览器的本地时区),这是可以理解的,因为它需要在本地拥有 TZ 数据。

我看到的唯一方法是再带一个图书馆。
编辑: 等一下,Date.toLocaleString 支持 timeZone 参数(但似乎浏览器支持有限,例如 Android 不支持此 (好吧,Chrome 会,Firefox 不会,WebViews 可能不会)):

new Date(1502769000000).toLocaleString('en-US', { timeZone: 'America/New_York' })
// 8/14/2017, 11:50:00 PM"

(所以你只需要自己添加 "EDT" 后缀)

或者,moment-timezone (which itself requires moment):

var t = 1502769000000;
var f = 'M/D/Y h:mma z';
moment(t).tz('America/New_York').format(f);
// 8/14/2017 11:50pm EDT
moment(t).tz('Europe/Paris').format(f);
// 8/15/2017 5:50am CEST

由于您始终需要相同的 TZ,您可能有兴趣注意到,从技术上讲,build a lighter version yourself 仅使用您需要的 TZ 数据子集也是可能的。