gpt4 book ai didi

javascript - 如何在特定日期和时间创建 `Temporal.Instant` 的实例?

转载 作者:行者123 更新时间:2023-12-05 02:25:57 26 4
gpt4 key购买 nike

我正在为 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(小时).padStart(2, '0') + ':' + String(分钟).padStart(2, '0') + 'Z') ;//😱

请告诉我我错过了什么。

最佳答案

您的 PlainDateTime represents不包含时区信息的日历日期和挂钟时间”。将其转换为 exact time ,您需要使用 toZonedDateTime method 提供时区.然后通过 toInstant method 忽略日历和时区,您可以获得所需的 Instant 实例。

所以有几种方法可以实现这一点:

  • 创建一个PlainDateTime from一个对象,通过假定 UTC timezone 将其转换为 instant:

    Temporal.PlainDateTime.from({year, month, day, hour, minute}).toZonedDateTime("UTC").toInstant()
  • 使用 the constructor 创建一个 PlainDateTime ,通过假定 UTC 时区将其转换为瞬间:

    new Temporal.PlainDateTime(year, month, day, hour, minute).toZonedDateTime("UTC").toInstant()
  • 直接创建一个ZonedDateTime from一个对象,在那里提供时区,然后转换它:

    Temporal.ZonedDateTime.from({timeZone: 'UTC', year, month, day, hour, minute}).toInstant()
  • 除了通过分区日期时间,您还可以 get the instant TimeZone 实例归因于 PlainDateTime 对象:

    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))
  • 如果您想在您的代码中对瞬间进行硬编码,您也可以直接创建它from一个 ISO 字符串:

    Temporal.Instant.from("2022-10-23T02:50Z")
  • 如果您愿意包含旧的 Date 方法,您也可以使用 Date.UTC计算 millisecond value for the instant - 当心从零开始的月份:

    Temporal.Instant.fromEpochMilliseconds(Date.UTC(year, month-1, day, hour, minute));

用您的特定示例亲自尝试:

const year = 2022;
const month = 10;
const day = 23;
const hour = 2;
const minute = 50;

log(Temporal.PlainDateTime.from({year, month, day, hour, minute}).toZonedDateTime("UTC").toInstant());
log(new Temporal.PlainDateTime(year, month, day, hour, minute).toZonedDateTime("UTC").toInstant());
log(Temporal.ZonedDateTime.from({timeZone: 'UTC', year, month, day, hour, minute}).toInstant());
log(Temporal.TimeZone.from("UTC").getInstantFor(Temporal.PlainDateTime.from({year, month, day, hour, minute})));
log(new Temporal.TimeZone("UTC").getInstantFor(new Temporal.PlainDateTime(year, month, day, hour, minute)));
log(Temporal.Instant.from("2022-10-23T02:50Z"));
log(Temporal.Instant.fromEpochMilliseconds(Date.UTC(year, month-1, day, hour, minute)));
<script src="https://tc39.es/proposal-temporal/docs/playground.js"></script>
<script>function log(instant) { console.log(instant.epochSeconds); }</script>

关于javascript - 如何在特定日期和时间创建 `Temporal.Instant` 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74168070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com