【问题标题】:Moment.js issues with .format() using Zulu timeMoment.js 使用 Zulu 时间处理 .format() 问题
【发布时间】:2018-11-09 14:18:18
【问题描述】:

我正在编写一个需要从数据库中检索和存储时间戳的脚本。数据库中的时间戳被检索为 UTC Zulu 格式的字符串“YYYY-MM-DDTHH:MM:SS.SSSZ”。我想在本地时间以“YYYY-MM-DDTHH:MM:SS.SSS”格式存储这个时间戳。我目前正在尝试用 moment.js 来做这件事,我用 ".toISOString()" 和其他方法收效甚微。

但是,我注意到“moment(timestamp).format()”的输出没有返回我对 UTC 的了解所期望的字符串。这是一个复制我的问题的代码示例:

var moment = require('moment');

var timestamp = new Date('2018-05-30T15:01:01.111Z');

console.log(timestamp);
console.log(moment(timestamp).format('YYYY-MM-DDTHH:mm:ss.sss'));
console.log(moment(timestamp).format('YYYY-MM-DDTHH:MM:SS.SSS'));

这是我的输出:

2018-05-30T15:01:01.111Z
2018-05-30T16:01:01.011
2018-05-30T16:05:11.111

这是我的预期:

2018-05-30T15:01:01.111Z
2018-05-30T16:01:01.111
2018-05-30T16:01:01.111

为什么在 .format() 中将大小写从 'YYYY-MM-DDTHH:mm:ss.sss' 更改为 'YYYY-MM-DDTHH:MM:SS.SSS' 会导致不同的输出?我的预期输出是否正确或有误解的时刻。(时间戳)。格式()?最后,在这种情况下,是否有更好的方法来实现我的预期输出?

【问题讨论】:

  • mm 是分钟 MM 是几个月
  • 阅读documentation怎么样? 1.没有sss格式,2.大写版本SSS,...返回小数秒,因此毫秒,...,3.MM返回月份
  • 小心new Date() 会将您的时间戳更改为您的本地时间戳。

标签: javascript node.js timestamp momentjs utc


【解决方案1】:

http://momentjs.com/docs/#/displaying/format/

MM 是几个月,这就是你得到2018-05-30T16:05:11.111 5 的原因

没有sss,但有SSS

你说你想要这种格式“YYY-MM-DDTHH:MM:SS.SSS”我假设你的意思是分钟,因为你的预期结果。这是一种奇怪的存储日期的方式,因为没有月份而且它会重复几秒钟。

我建议以 UTC 存储。

var timestamp = new Date('2018-05-30T15:01:01.111Z');

console.log(timestamp);
console.log(moment(timestamp).format('YYYY-MM-DDTHH:mm:ss:SSS'));

// i'd suggest UTC over formating but if you were i'd use
console.log(moment(timestamp).format('YYYY-MM-DDTHH:MM:mm:SSS'));
//2018-05-30T15:01:01.111Z
//2018-05-30T16:01:01.111
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.js"></script>

如果这是你想要的,请告诉我。

【讨论】:

  • 谢谢乔,这正是我所需要的。我没有发现 MM 代表月份,而 mm 代表分钟。我想以未格式化的 UTC 格式存储我的时间戳,但是当我使用 UTC 时间戳查询数据库时,我使用的 npm 包 odbc 似乎有问题。我需要格式化邮票来解决这个问题。谢谢你的时间乔!
  • 不用担心,很高兴为您提供帮助。您在查询时遇到什么问题,如果可能的话,我会尝试解决这个问题而不是这个:) 祝你有美好的一天
  • 感谢您的帮助。例如,我正在使用的 npm 包 odbc 以“2018-05-30T15:35:57.000Z”的格式返回我的时间戳。我不知道这是我服务器上的节点 odbc 还是 sybase odbc 驱动程序导致的。具有讽刺意味的是,虽然我收到了这种格式的时间戳,但如果我用这种格式查询数据库,它会返回一个错误。同样使用 UTC 中的此时间戳查询数据库会返回比本地时间晚一小时的值,就好像它没有被正确转换一样。在您的帮助下,它给我留下了当前的方法,虽然并不完美 =)
  • 如何获得像 2018-05-30T15:01:01.111Z 这样的 Zulu 时间戳格式 - console.log(moment().utc().format('YYYY-MM-DDTHH:MM :mm:ss.SSSZ'));//返回2018-05-30T15:01:01.111+00:00
  • @Vijay - 尝试 .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')。 [] 是转义字符,Z 将在格式化后按原样附加。
猜你喜欢
  • 2012-10-27
  • 2020-03-26
  • 2017-05-02
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
相关资源
最近更新 更多