为什么 Moment.js 给出的毫秒数不同?

3

使用moment js时,我遇到了同一日期不同毫秒数的错误。

我从服务器获取数据 ('-2208988800000')。我将该值转换为 'DD-MMM-YYYY' 格式。现在我想再次获得相同的毫秒数,但是为什么我会得到同一日期的不同毫秒数呢?以下是我的代码:

http://plnkr.co/edit/1QoWLoFqkNAe2ebZ0V01?p=preview

我有两个控制台x1x2。它们不同,为什么?

var x = '-2208988800000'
var d = new Date(moment(new Date(parseInt(x)).toUTCString()).format('DD-MMM-YYYY'));
console.log(d)
var x2 = moment(new Date(d).toUTCString()).format('x');
console.log(x2)
// why x1 and x2 is different
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

如何获得相同的值?

2个回答

6

在处理moment对象、date对象和字符串之间的转换时,你可能会遇到很多麻烦。但实际上,这些操作都是不必要的。

至于结果,第一个调用date构造函数的参数为字符串 '31-Dec-1899',因此你可以简化示例:

var d = new Date('31-Dec-1899');
console.log(+d);

这将根据您使用的浏览器而产生不同的结果(因为当不处于标准格式时,日期对象的解析实现依赖于实现),并且在代码运行的时区上会因时区差异而有所不同(因为它假定该值是以本地时间为基础的)。对于我来说,在美国太平洋时区的Windows 10上运行Chrome 70,这将记录-2209046400000。您可能会得到不同的结果。
一般来说,请不要进行过多的操作。大多数您需要的功能都内置在Moment中。每当您发现自己将对象转换为字符串并再次转换为对象,或使用Date构造函数时,您可能会引入错误。

那么实现 DOB 的最佳方法是什么? - user10288182
你能具体一些吗?你想要做什么? - Matt Johnson-Pint
我稍后会解释更多。实际上,我从服务器获取长整型值以显示出生日期(DOB)格式为DD-MMM-YYYY。用户可以选择编辑出生日期并将其发送到服务器,以毫秒或长整型的形式发送。如果没有更改,则用户应该发送与从服务器获取的相同的值。 - user10288182
1
此时,您应该提出一个新的问题。首先搜索 [tag:momentjs] 标签,并阅读 Moment.js 网站上的指南和文档。 - Matt Johnson-Pint
由于您似乎是新来的,请同时查看以下链接以获取更多帮助:什么是XY问题?如何提出好问题?如何创建一个最小、完整且可验证的示例。感谢您的加入! - Matt Johnson-Pint

0

当你将日期格式化为DD-MMM-YYYY时,你会失去小时和分钟,这就是其中的原因之一。

尝试更新你的代码为

var d = new Date(moment(new Date(parseInt(x)).toUTCString()).format('DD-MMM-YYYY HH:mm:ss'));

然后您将获得一个更接近的时间戳


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接