使用moment.js和moment时区将日期、时间和偏移量转换为ISO8601 DateTime



我正在处理一些行程数据,其中时间和日期都在本地时区中提供。我正在将这些数据添加到一个数据库中,我想在其中存储UTC的所有日期,并使用适当的时区偏移量。我正试着用moment.js.处理这些日期

日期/时间的输入字符串的格式类似于2020-07-12 13:00,时区的格式为Europe/Amsterdam

我想得到一个字符串,比如:

2020-07-12T11:00:00+02:00

我遇到的问题是,如果我使用.utc()方法,那么这个时刻会将我的输入时间转换为本地时间或utc。

这个代码给了我正确的结果,但我不明白为什么,我也不确定我是否可以依赖它的准确性:

var offset = moment.tz(`Europe/Amsterdam`).utcOffset();
var m = moment(`2020-07-12 13:00`, 'YYYY-MM-DD HH:mm').utc().subtract(240 + offset + offset, 'minutes').utcOffset(offset); // (240 is my own UTC offset)

如何简单地输入日期、时间和时区,并最终得到正确的ISO8601 DateTime?

如果您已经在应用程序中使用Moment和Moment TimeZone,那么您只需执行以下操作:

const m = moment.tz('2020-07-12 13:00', 'YYYY-MM-DD HH:mm', 'Europe/Amsterdam');
m.format() //=> "2020-07-12T13:00:00+02:00"

然而,Moment团队建议使用Luxon进行新的开发。相当于:

const dt = luxon.DateTime.fromFormat('2020-07-12 13:00', 'yyyy-MM-dd HH:mm', { zone: 'Europe/Amsterdam'});
dt.toISO()  //=> "2020-07-12T13:00:00.000+02:00"

唯一的区别是包括了毫秒。如果您喜欢不同的输出,可以使用不同的格式设置功能。

Luxon的主要优势在于,它使用了ECMAScript国际化API提供的内置时区功能,而Moment-Timezone捆绑了自己的时区数据,这些数据可能非常大。

此外,请注意,在您的问题中,通过询问2020-07-12T11:00:00+02:00,您似乎误解了ISO 8601格式。在该格式中,显示的时间是当地时间。因此,它应该是13:00,而不是11:00+02:00的意思是,"这是本地时间与UTC的偏移量"。(这并不意味着你应用偏移量来获得当地时间。(

最新更新