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