使用moment.js将日期转换为纪元然后返回日期


76

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

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


1
我在第一行收到此警告:弃用警告:瞬间构建回退到js Date。不建议这样做,并将在即将发布的主要版本中将其删除。请参阅github.com/moment/moment/issues/1407了解更多信息。
timaschew

Answers:


165

这里有些错误:

  • 首先,术语。 “时代”指事物的起点。“ Unix时代”是1970年1月1日UTC午夜。您不能将任意的“日期字符串转换为纪元”。您可能指的是“ Unix时间”,它通常被错误地称为“ Epoch时间”。

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

  • 您在解析字符串时未提供格式说明符。这不是一个好主意,因为1/2/2014之类的值可以解释为2月1日还是1月2日,具体取决于代码运行的语言环境。(这也是在控制台中收到弃用警告的原因。)相反,请提供与预期输入匹配的格式字符串,例如:

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • .calendar()有一个非常特定的用途。如果您临近日期,它将返回类似“今天9:00 AM”的值。如果这不是您期望的,则应改用该.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);

3
有趣的快捷方式.valueOf()->+moment()
亚当·莫萨

14

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()

2
请参考github.com/moment/moment/issues/1407,目前上述方法已不推荐使用。
肯尼迪·尼亚加

3
一个更好,更准确的选择是使用valueOf()
reectrix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.