如何将 JS 日期从 UTC 'Z' 转换为时区日期

How to convert JS Date from UTC 'Z' to timezoned date

嘿,我正在从数据库中接收日期,该数据库将这些日期保存为 UTC。当我用 console.log 打印其中一个日期时,它看起来像这样 2021-04-07T07:00:00.000Z.

现在我想把它转换成Europe/Berlin时间。但不是字符串,我希望它是 Javascript Date.

我尝试做的事情

我安装了 date-fnsdate-fns-tz,我尝试使用这些包中的多个功能,但似乎没有任何功能正常运行或 returns 正确的日期,但再次与 'Z' 后缀.

示例,其中 testDate 是前面提到的日期

// using utcToZonedTime from date-fns-tz
console.log(utcToZonedTime(testDate, 'Europe/Berlin'));
// output: 2021-04-07T07:00:00.000Z

// using getTimezoneOffset from date-fns-tz
console.log(getTimezoneOffset('Europe/Berlin', testDate) / 1000 / 60)
// output: 120

// using addMinutes from date-fns to add the Offset manually
  console.log(
        addMinutes(
          testDate,
          getTimezoneOffset('Europe/Berlin', testDate) / 1000 / 60,
        ),
      );
// output: 2021-04-07T09:00:00.000Z

只有最后一种情况输出正确的日期,但格式仍然错误。如何获得我所在时区的正常日期。

Now I want to convert it into Europe/Berlin time. But not as a String, I want it as Javascript Date.

那是不可能的。 JavaScript Date 对象不 包含 任何时区信息。它唯一包含的是 Unix timestamp ,精度为毫秒。也就是说,Date对象封装了自1970-01-0100:00:00.000 UTC(不算闰秒)以来的毫秒数。您可以直接使用 .getTime().valueOf() 或通过任何将 Date 对象转换为 Number.

的机制来查看此值

当观察一个 Date 对象并看到时区或特定时区中的值时,该行为在函数本身的运行时发生。例如,Date 对象的 toString 函数在将基于 UTC 的内部时间戳转换为计算机本地时间之前使用计算机的本地时区 returning 字符串已格式化该结果。

Date 对象上的大多数函数在 UTC 或计算机的本地时区(如所述)中工作。唯一适用于其他时区的是 toLocaleStringtoLocaleDateStringtoLocaleTimeString 函数,它们将在 timeZone 选项中接受 IANA 时区标识符。与 toString 函数一样,它们在生成字符串时仅 使用 这个时区。他们不保留它。

简而言之,Date对象不包含时区,所以你要求的是不可能的。

其他几件事:

  • 不要直接在 Date 对象上调用 console.log。该行为是未定义的。一些实现 return toString 的值,而其他 return toISOString.

    的值
  • 永远不要尝试 add/subtract 在 date/time 上进行偏移,除非你真的知道自己在做什么。在大多数情况下,您并不是在调整时区,而是实际上选择了不同的时间点。

  • 是的,ISO 8601 时间戳末尾的 Z 表示显示的日期和时间采用 UTC。