我正在处理一些行程数据,其中时间和日期都在本地时区中提供。我正在将这些数据添加到一个数据库中,我想在其中存储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的偏移量"。(这并不意味着你应用偏移量来获得当地时间。(