我正在尝试将日期字符串转换为纪元,然后将纪元转换回日期字符串以验证我提供的日期字符串是否正确。
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
注意:我正在使用以下版本的 moment js 脚本,//cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment-with-locales.js
最佳答案
这里有一些错误:
首先,术语。 "Epoch"指事物的起点。 “Unix 纪元”是世界标准时间 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”的值。如果这不是您所期望的,您应该使用.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);
在我的机器上,在美国太平洋时区,结果是:
Values are: ts = 1413388800000, s = 10/15/2014 9:00
由于输入值是根据本地时间解释的,如果您处于不同的时区,您将获得不同的 ts
值。
另请注意,如果您真的想使用整秒(可能会失去精度),moment 也有相应的方法。您将使用 .unix()
返回整秒的时间戳,并使用 moment.unix(ts)
将其解析回某个时刻。
var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);
关于javascript - 使用 momentjs 将日期转换为纪元然后返回日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26392280/