Tim*_*ijk 6 javascript datetime utc ecmascript-temporal
我\xe2\x80\x99m 与 JavaScript\xe2\x80\x99s提出的新 Temporal API作斗争。我想做的事情应该是直截了当的,但我未能找到令人信服的解决方案。我肯定错过了什么。
\n任务如下:根据年、月、日、小时和分钟变量实例化 UTC 日期时间的对象表示。
\n我的想法如下:
\nTemporal.Instant;new Temporal.Instant()需要以纳秒为单位的时间戳,因此 \xe2\x80\x99 不起作用;Temporal.Instant.from()需要一个 ISO 日期时间字符串,这需要我从 \xe2\x80\x94 的五个变量生成格式正确的文本,这是可能的,但有点黑客攻击,有点违背了使用日期时间库的目的;Temporal.PlainDateTime.from(){ year, month, day, hour, minute }具有正确的设计,因为它接受像;这样的对象Instant从中创建一个PlainDateTime. 但这似乎不可能?除了再次通过 \xe2\x80\x94 \xe2\x80\x94 ns\xe2\x80\xa6 中的日期时间字符串或时间戳?这太愚蠢了!这里的用例是非常基本的,但它\xe2\x80\x99(对我来说)根本不明显如何解决它。
\n我期望能够简单地做类似的事情: 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\'); //
请告诉我我\xe2\x80\x99m 忽略了一些东西。
\n您PlainDateTime 代表“不携带时区信息的日历日期和挂钟时间”。要将其转换为准确的时间,您需要使用toZonedDateTime方法提供时区。然后通过toInstant方法忽略日历和时区,您可以获得所需的Instant实例。
因此,有几种方法可以实现这一目标:
PlainDateTime 从一个对象创建一个,通过假设时区将其转换为即时UTC:
Temporal.PlainDateTime.from({year, month, day, hour, minute}).toZonedDateTime("UTC").toInstant()
Run Code Online (Sandbox Code Playgroud)
PlainDateTime使用构造函数创建一个,通过假设时区将其转换为即时UTC:
new Temporal.PlainDateTime(year, month, day, hour, minute).toZonedDateTime("UTC").toInstant()
Run Code Online (Sandbox Code Playgroud)
ZonedDateTime直接从对象创建一个对象,并在其中提供时区,然后将其转换:
Temporal.ZonedDateTime.from({timeZone: 'UTC', year, month, day, hour, minute}).toInstant()
Run Code Online (Sandbox Code Playgroud)
您还可以获取实例归属于对象的时刻,而不是通过分区日期时间:TimeZonePlainDateTime
Temporal.TimeZone.from("UTC").getInstantFor(Temporal.PlainDateTime.from({year, month, day, hour, minute}))
new Temporal.TimeZone("UTC").getInstantFor(new Temporal.PlainDateTime(year, month, day, hour, minute))
Run Code Online (Sandbox Code Playgroud)
如果您想在代码中硬编码该时刻,您也可以直接从ISO 字符串创建它:
Temporal.Instant.from("2022-10-23T02:50Z")
Run Code Online (Sandbox Code Playgroud)
如果您愿意包含旧Date方法,您还可以使用Date.UTC计算即时的毫秒值- 请注意从零开始的月份:
Temporal.Instant.fromEpochMilliseconds(Date.UTC(year, month-1, day, hour, minute));
Run Code Online (Sandbox Code Playgroud)
用你的具体例子亲自尝试一下:
Temporal.PlainDateTime.from({year, month, day, hour, minute}).toZonedDateTime("UTC").toInstant()
Run Code Online (Sandbox Code Playgroud)
new Temporal.PlainDateTime(year, month, day, hour, minute).toZonedDateTime("UTC").toInstant()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |