我试图将日期字符串转换为纪元,然后将纪元转换回日期字符串,以验证我是否提供了正确的日期字符串。
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
答案 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()