ECMAScript的新Temporal
提案(最终!)定义了一个用于在JS中处理日期和时间的现代API,包括时区安全算法和非公历日历。
我知道我可以使用ISO 8601或RFC 3339字符串与Temporal
。如果我有字符串数据,我想解析成JS日期/时间对象,我应该使用哪种时态类型?
要确定应该用于解析字符串的Temporal
类,选择其数据模型与字符串中的数据匹配的类型是很重要的。
Temporal.Instant
表示精确时间。它的数据模型是自1970年1月1日UTC以来的整数纳秒数。这种类型不知道时区,也不提供访问日历/时钟单位(如月或小时)的方法。它只是一个时间戳。Temporal.ZonedDateTime
表示特定时区的准确时间。它的数据模型是时间戳(如Temporal.Instant
)、时区(通常是IANA区域)和日历。时区是必需的,因为这种Temporal
类型(并且只有这种类型)允许dst安全地创建派生值。当你向Temporal.ZonedDateTime
实例添加1天时,确切的时间通常是24小时后,但如果添加跨越DST转换,可能是23或25小时。Temporal.PlainDate
表示无时区日期:没有时间且不引用时区的本地日期。数据模型为年/月/日和日历。Temporal.PlainMonthDay
表示生日、周年纪念或其他经常性事件。其数据模型为月、日和日历。Temporal.PlainYearMonth
表示特定年份中的月份,如2022年1月。其数据模型为年、月和日历。Temporal.PlainTime
表示无时区时间:不参考日期、时区或日历的本地时间。它的数据模型是小时/分/秒,秒分辨率低至9位十进制数字(纳秒)。Temporal.PlainDateTime
表示不参考时区的本地日期和时间。它的数据模型是年/月/日/时/分/秒和日历。这种类型很少使用,因为上面的类型涵盖了大多数用例。如果您只关心确切的时间戳而不关心时区,那么使用Temporal.Instant
。如果您只关心本地日期,那么使用Temporal.PlainDate
。如果您关心确切的时间和时区,那么使用Temporal.ZonedDateTime
。除了Temporal.PlainDateTime
文档中详细介绍的几个用例外,大多数情况下最好使用不同的类型。Temporal.Duration
表示一段时间。它的数据模型是数年、月、日、时、分、秒、毫秒、微秒和纳秒。Temporal.TimeZone
表示IANA时区,如Asia/Tokyo
或(很少)偏移时区,如+06:00
。其数据模型是时区的规范ID,例如"Asia/Tokyo"
或"+06:00"
。Temporal.Calendar
表示日历,如希伯来语、中文或默认的ISO 8601日历。其数据模型是日历的ID,例如"iso8601"
或"hebrew"
。
注意,像'12/25/2022'
这样的本地化字符串格式不能被时态解析。只有明确的、计算机可读的格式才能被Temporal解析,比如'2022-25-12'
。