注意:截至2022年3月,这个答案仍在不断获得赞同。 moment.js 库已被弃用。以下是两个主要的替代品:Luxon 和 Day.js,其他可在弃用链接中找到。
Luxon
Luxon 可以被认为是 Moment 的进化版本。它由 Moment 的长期贡献者Isaac Cambron编写。请阅读 Luxon 文档中的Why does Luxon exist?和For Moment users页面。
区域设置:Intl 提供的 时区:Intl 提供的
Day.js
Day.js 设计成 Moment.js 的极简替代品,使用类似的 API。虽然它不是一个直接替代品,但如果你习惯于使用 Moment 的 API 并希望快速入门,请考虑使用 Day.js。
区域设置:可单独导入的自定义数据文件 时区:通过插件提供的国际化时间
我使用 Day.js 是因为它更小,但 Luxon 更易处理。
几乎所有关于网络上 to-ISO 方法都会在输出字符串之前将时区信息应用于转换到 "Z"ulu 时间(UTC),从而丢弃时区信息。浏览器的本机 .toISOString() 也会删除时区信息。
这样做就丢弃了有价值的信息,因为服务器或接收者可以始终将完整的 ISO 日期转换为它所需的 Zulu 时间或任何其他时区,并仍然获取发件人的时区信息。
我找到的最好的解决方案是使用 Moment.js JavaScript 库,并使用以下代码:
获取当前带有毫秒和时区信息的 ISO 时间
now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
获取具有时区信息但不包含毫秒的本机JavaScript Date对象的ISO时间
var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")
这可以与 Date.js 结合使用,以获取像 Date.today() 这样的函数,其结果可以传递给 moment。
格式化为此类日期字符串符合 JSON 规范,并且很适合存储到数据库中。Python 和 C# 似乎很喜欢它。
new Date("xx").toISOString()
会产生NaN-NaN-NaNTNaN:NaN:NaN.NZ
的结果。原生实现会抛出 RangeException 异常。 - Joseph Lennox