我正在努力解决JavaScript的proposed new Temporal API。我试图做的事情应该是直截了当的,但我没有找到一个令人信服的解决方案。我一定是错过了什么。
任务如下:从年、月、日、小时和分钟变量示例化UTC日期时间对象表示。
我的想法如下:
- 我们讨论的是UTC,因此我需要
Temporal.Instant
; new Temporal.Instant()
需要以纳秒为单位的时间戳,因此无法工作;Temporal.Instant.from()
需要一个ISO日期时间字符串,这需要我从我拥有的五个变量中生成一段格式正确的文本--这是可能的,但有点麻烦,有点违背了使用日期时间库的目的;Temporal.PlainDateTime.from()
具有正确的设计,因为它接受像{ year, month, day, hour, minute }
这样的对象;- 因此,我们需要做的就是从这个
PlainDateTime
创建一个Instant
。这似乎是不可能的,虽然?除了通过-再次-一个日期时间字符串或时间戳在ns...?
这是愚蠢的!这里的用例是超级基本的,但它不明显(对我来说)在所有如何解决它。
我希望能够简单地做一些像这样的事情:Temporal.Instant.from({ year, month, day, hour, minute });
现在我能想到的最好的办法是:Temporal.Instant.from(year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0') + 'T' + String(hour).padStart(2, '0') + ':' + String(minute).padStart(2, '0') + 'Z'); // 😱
拜托告诉我我是不是忽略了什么。
2条答案
按热度按时间ql3eal8s1#
您的
PlainDateTime
表示“a calendar date and wall-clock time that does not carry time zone information"。若要将它转换为精确的时间,您需要使用toZonedDateTime
方法提供一个时区。然后通过toInstant
方法忽略日历和时区,您可以获得所需的Instant
示例。有几种方法可以实现这一点:
PlainDateTime
,通过假定UTC
时区将其转换为instant:PlainDateTime
,并假设UTC
时区,将它转换为即时:ZonedDateTime
,在其中提供时区,然后转换它:TimeZone
示例归属于PlainDateTime
对象的时刻:Date
方法,您也可以使用Date.UTC
来计算即时月份的毫秒值-注意从零开始的月份:用你自己的例子来试试:
第一个
rm5edbpk2#
{year, month, day, etc.}
的输入对象,唯一的麻烦是使用BigInt处理纳秒,这并不难:然后,可以创建一个 instant: