Moment.js在使用Zulu时间格式时出现.format()问题

4
我正在编写一个脚本,需要从数据库检索和存储时间戳。从数据库检索到的时间戳是一个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'会导致不同的输出结果?我的期望输出是正确的吗,还是我理解有误?最后,在这种情况下是否有更好的方法来实现我期望的输出?

3
“mm” 表示分钟,“MM” 表示月份。 - Joe Warner
1
阅读一下文档怎么样?1. 没有 sss 格式,2. 大写版本的 SSS 等返回分数秒,因此是毫秒,...,3. MM 返回月份。 - Andreas
小心new Date()会将你的时间戳转换为本地时间戳。 - RajnishCoder
1个回答

8

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>

请告诉我您是否希望这样。


谢谢Joe,这正是我需要的。我之前没有注意到MM代表月份,mm代表分钟。我想将我的时间戳以未格式化的UTC存储,但是我使用的npm包odbc在查询UTC时间戳的数据库时似乎存在问题。我不得不格式化时间戳来解决这个问题。感谢您的时间,Joe! - Todd
没问题,很高兴能帮忙。你在查询方面遇到了什么问题?如果可能的话,我会尝试解决它而不是这个问题 :) 祝你有美好的一天。 - Joe Warner
我想,如果他们比一个小时早,那是因为服务器的时区不同,偏移量会被解决,但我可能错了。 - Joe Warner
2
如何获得类似于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
4
@Vijay - 请尝试使用.format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')。[]是转义字符,格式化后Z会原样附加。 - jsmtslch
显示剩余2条评论

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