D3v4:d3.timeParse失败,带有UNIX纪元秒(%s)

时间:2017-10-31 19:54:58

标签: javascript datetime d3.js

我的数据集包括UNIX时间戳,例如“1509392160”。我似乎无法解析使用d3.timeParse("%s")的那些,它返回null。

使用d3.timeFormat检查反向流程也失败了。官方示例和所有其他格式字符串有效:

var formatTime = d3.timeFormat("%B %d, %Y");
formatTime(new Date); // -> "June 30, 2015"

但是,格式化为UNIX(毫秒)只会返回“%s”和“%Q”的“s”或“Q”:

var formatTime = d3.timeFormat("%s");
formatTime(new Date); // -> "s"

使用D3 v4.11.0 btw。 我错过了什么?

2 个答案:

答案 0 :(得分:7)

我只使用d3-time-format模块运行此代码并且没有问题:

var parse = d3.timeParse("%s");
var time = parse(1509392160);

console.log(time);

var format = d3.timeFormat("%s");
time = format(Date.now());

console.log(time);
<script src="https://d3js.org/d3-time-format.v2.min.js"></script>

但是,正如您所知,这不适用于d3 v4.11(也不适用于任何其他版本的d3 v4)。似乎d3-time-format最近才增加了支持解析UNIX时间戳的功能,并且是released on October 9, 2017

在最新版本中添加了“%s”和“%Q”选择器以及“%f”,“%u”和“%V”,这些其他选项也似乎在v4中不起作用。 11:

console.log(d3.timeParse("%u")(1));  // day of week
console.log(d3.timeParse("%V")(25)); // week of year
console.log(d3.timeParse("%f")(100));// microseconds

console.log("For Comparison, %Y:");
console.log(d3.timeParse("%Y")(2017)); // Year
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>

同时,似乎d3 v4.11是released on October 3rd, 2017。因此,最近的d3核心库似乎在这方面已经过时了。我想很快就会有更新版本。

虽然您应该能够将核心库用于其他所有内容,并使用模块进行时间格式化/解析以获得所需的功能(直到出现更新):

var parse = d3.timeParse("%Q");
var time = parse(1509392160);

d3.select("body").append("p")
  .html(time);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>
<script src="https://d3js.org/d3-time-format.v2.min.js"></script>

答案 1 :(得分:4)

作为Andrew's answer的补充,这就是问题所在:

D3 default(core)bundle在source code

中有这些说明符
var parses = {
    "a": parseShortWeekday,
    "A": parseWeekday,
    "b": parseShortMonth,
    "B": parseMonth,
    "c": parseLocaleDateTime,
    "d": parseDayOfMonth,
    "e": parseDayOfMonth,
    "H": parseHour24,
    "I": parseHour24,
    "j": parseDayOfYear,
    "L": parseMilliseconds,
    "m": parseMonthNumber,
    "M": parseMinutes,
    "p": parsePeriod,
    "S": parseSeconds,
    "U": parseWeekNumberSunday,
    "w": parseWeekdayNumber,
    "W": parseWeekNumberMonday,
    "x": parseLocaleDate,
    "X": parseLocaleTime,
    "y": parseYear,
    "Y": parseFullYear,
    "Z": parseZone,
    "%": parseLiteralPercent
};

正如您所看到的,如果将其与complete list here进行比较,则会遗漏所有这些:

  • &#34; F&#34;
  • &#34; Q&#34;
  • &#34; S&#34;
  • &#34; V&#34;
  • &#34; U&#34;

所以,现在的替代方案是引用时间独立微库:

<script src="https://d3js.org/d3-time-format.v2.min.js"></script>
编辑:确实,默认捆绑包还没有那些新的指令。这是Bostock关闭的GitHub问题:https://github.com/d3/d3-time-format/issues/38

同时,只需坚持使用独立的微库。