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

Ian*_*vis 60 javascript date momentjs

我正在尝试将日期字符串转换为epoch,然后将epoch转换回日期字符串以验证我是否提供了正确的日期字符串.

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);
Run Code Online (Sandbox Code Playgroud)

呈现

Values are: epoch = 1413378000, momentDateStr = 01/17/1970
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 138

这里有一些问题:

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

  • .unix()以秒为单位返回Unix Time,但默认moment构造函数接受以毫秒为单位的时间戳.您应该使用.valueOf()返回毫秒.请注意,调用.unix()*1000也可以,但会导致精度损失.

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

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
    Run Code Online (Sandbox Code Playgroud)
  • .calendar()有一个非常具体的用途.如果您接近日期,它将返回"今天上午9:00"之类的值.如果这不是您的预期,您应该使用该.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);
Run Code Online (Sandbox Code Playgroud)

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

值为: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);
Run Code Online (Sandbox Code Playgroud)

  • .valueOf()`->`+ moment()`的有趣快捷方式 (2认同)

tim*_*hew 9

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()
Run Code Online (Sandbox Code Playgroud)

  • 请参阅https://github.com/moment/moment/issues/1407,目前上述方法已被折旧. (2认同)
  • 更好,更准确的选择是使用`valueOf()`。 (2认同)