moment.js没有正确地将纪元转换为ISO8601

时间:2014-09-06 03:46:33

标签: node.js momentjs

我使用moment.js将ISO8601格式的时间转换为纪元。但是当我转换回来时结果不一样。有什么想法吗?

node.js代码

var moment = require('moment');
var input ="2014-08-23T15:05:36-07:00";
var a = moment(input,moment.ISO_8601).valueOf();
console.log ("convert ISO8601 to epoch time:" + input + "====>" + a);
var b = moment(parseInt(a)).format("YYYY-MM-DDTHH:MM:SSZ");
console.log ("convert epoch time to ISO8601:" + a + "====>" + b);

输出

convert ISO8601 to epoch time:2014-08-23T15:05:36-07:00====>1408831536000
convert epoch time to ISO8601:1408831536000====>2014-08-23T15:08:00-07:00

2 个答案:

答案 0 :(得分:1)

我总是使用moment.format()来获取ISO8601字符串,而不是传入自定义格式字符串。例如:

var moment = require('moment');
var input ="2014-08-23T15:05:36-04:00";
var a = moment(input,moment.ISO_8601).valueOf();
console.log ("convert ISO8601 to epoch time:" + input + "====>" + a);
var b = moment(parseInt(a)).format();
console.log ("convert epoch time to ISO8601:" + a + "====>" + b);

输出:

convert ISO8601 to epoch time:2014-08-23T15:05:36-04:00====>1408820736000
convert epoch time to ISO8601:1408820736000====>2014-08-23T15:05:36-04:00

答案 1 :(得分:1)

一些事情:

  • 您使用的格式字符串为"YYYY-MM-DDTHH:MM:SSZ"。但是,MM表示月份,而不是分钟 - 而SS表示小数秒的前两位小数。如果要提供格式字符串,则为"YYYY-MM-DDTHH:mm:ssZ"。它区分大小写。

  • 正如mscdex指出的那样,您可以使用.format()而不使用任何参数,因为这是默认的输出格式。

  • 在这种情况下,
  • moment.ISO_8601不是必需的,因为您只解析单一格式,默认情况下理解ISO-8601。

  • parseInt也不是必需的。 Moment将理解以整数或字符串形式传递的值。

因此,代码可以简化为:

var moment = require('moment');
var input ="2014-08-23T15:05:36-04:00";
var a = moment(input).valueOf();
console.log ("convert ISO8601 to epoch time:" + input + "====>" + a);
var b = moment(a).format();
console.log ("convert epoch time to ISO8601:" + a + "====>" + b);