Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用momentjs将日期转换为历元,然后再转换回日期_Javascript_Date_Momentjs - Fatal编程技术网

Javascript 使用momentjs将日期转换为历元,然后再转换回日期

Javascript 使用momentjs将日期转换为历元,然后再转换回日期,javascript,date,momentjs,Javascript,Date,Momentjs,我试图将日期字符串转换为历元,然后将历元转换回日期字符串,以验证我提供的日期字符串是否正确 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 ar

我试图将日期字符串转换为历元,然后将历元转换回日期字符串,以验证我提供的日期字符串是否正确

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
注意:我正在使用以下版本的MomentJS脚本://cdnjs.cloudflare.com/ajax/libs/momente.js/2.8.3/momente with locales.js

您得到的是unix秒数,而不是毫秒数

您需要将其乘以1000或使用
valueOf()
并且不要忘记使用格式化程序,因为您使用的是非ISO 8601格式。如果您忘记传递格式化程序,则该日期将在UTC时区中解析,或作为无效日期解析

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()

这里有几件事不对:

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

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

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

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • 有非常特殊的用途。如果您接近该日期,它将返回类似“今天上午9:00”的值。如果这不是您所期望的,那么您应该使用该函数。同样,您可能希望传递一个格式说明符

  • 若要在评论中回答您的问题,请选择“否”-您不需要调用
    .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()
以整秒为单位返回时间戳,并使用
矩.unix(ts)
将其解析回某个时刻

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);

我在第一行得到了这样的警告:弃用警告:建设倒退到js日期的时刻。这是不鼓励的,将在即将发布的主要版本中删除。有关更多信息,请参阅。请参阅上述方法当前已折旧。一个更好、更准确的选项是使用
valueOf()
有趣的快捷方式
.valueOf()
->
+moment()