使用momentjs将日期转换为纪元然后再回到日期

时间:2014-10-15 21:18:48

标签: javascript date momentjs

我试图将日期字符串转换为纪元,然后将纪元转换回日期字符串,以验证我是否提供了正确的日期字符串。

var epoch = moment("10/15/2014 9:00").unix(); // do I need to do .local()?
var momentDate = moment(epoch); // I've also tried moment.utc(epoch) 
var momentDateStr = momentDate.calendar();
alert("Values are: epoch = " + epoch + ", momentDateStr = " + momentDateStr);

呈现

Values are: epoch = 1413378000, momentDateStr = 01/17/1970

注意:我正在使用以下版本的时刻js脚本,//cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment-with-locales.js

2 个答案:

答案 0 :(得分:122)

这里有一些问题:

  • 首先,术语。 "Epoch"指的是某事的起点。 " Unix Epoch"是UTC 1970年1月1日午夜。您无法将任意"日期字符串转换为纪元"。你可能意味着"Unix Time",这经常被错误地称为"大纪元时间"。

  • .unix()在整秒内返回Unix时间,但默认的moment构造函数接受毫秒中的时间戳。您应该使用.valueOf()返回毫秒。请注意,调用.unix()*1000也会起作用,但会导致精度下降。

  • 您在不提供格式说明符的情况下解析字符串。这不是一个好主意,因为像1/2/2014这样的值可以解释为2月1日或1月2日,具体取决于代码运行位置的区域设置。 (这也是您在控制台中获得弃用警告的原因。)而是提供与预期输入匹配的format string,例如:

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • .calendar()具有非常特殊的用途。如果您接近日期,它将返回类似"今天上午9:00和#34;的值。如果这不符合您的预期,则应使用.format()功能。同样,您可能想要传递格式说明符。

  • 要在评论中回答您的问题,否 - 您不需要致电.local().utc()

全部放在一起:

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").valueOf();
var m = moment(ts);
var s = m.format("M/D/YYYY H:mm");
alert("Values are: ts = " + ts + ", s = " + s);

在我的机器上,在美国太平洋时区,它会产生:

  

值为:ts = 1413388800000,s = 10/15/2014 9:00

由于输入值是根据当地时间解释的,因此如果您位于不同的时区,则会为ts获取不同的值。

另请注意,如果您确实希望使用整秒(可能会丢失精度),那么也可以使用方法。您可以使用.unix()在整秒内返回时间戳,并moment.unix(ts)将其解析回来。

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);

答案 1 :(得分:8)

http://momentjs.com/docs/#/displaying/unix-timestamp/

你得到的是unix秒数,而不是毫秒!

您需要将其乘以 1000 或使用valueOf()并且不要忘记使用格式化程序,因为您使用的是非ISO 8601格式。如果您忘记传递格式化程序,则日期将在UTC时区中解析或作为无效日期进行解析。

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()