【问题标题】:How to convert JS Date from UTC 'Z' to timezoned date如何将 JS 日期从 UTC 'Z' 转换为时区日期
【发布时间】:2021-07-03 13:07:31
【问题描述】:

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

现在我想将其转换为Europe/Berlin 时间。但不是作为字符串,我希望它作为 Javascript 日期。

我想做什么

我安装了date-fnsdate-fns-tz,并尝试使用这些包中的多个功能,但似乎没有任何功能可以正常工作或返回正确的日期,但再次使用“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

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

【问题讨论】:

  • 简单地使用new Date("2021-04-07T07:00:00.000Z")会发生什么?
  • @AnuragSrivastava 我再次使用“Z”得到完全相同的输出
  • 使用new Date,您可以根据您的时区获得正确的日期。要获得不带“Z”的字符串,只需使用字符串操作
  • 但是 Z 表示它是 UTC 还是不是?所以我必须手动删除它?有没有更好的方法呢

标签: javascript date datetime date-fns


【解决方案1】:

现在我想将其转换为欧洲/柏林时间。但不是作为字符串,我希望它作为 Javascript 日期。

这是不可能的。 JavaScript Date 对象不包含任何时区信息。它包含的唯一内容是具有毫秒精度的Unix timestamp。换句话说,Date 对象封装了自 1970-01-01 00:00:00.000 UTC 以来的毫秒数(不包括闰秒)。您可以使用.getTime().valueOf() 或通过任何将Date 对象转换为Number 的机制直接查看此值。

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

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

简而言之,Date 对象不包含时区,因此您要求的内容是不可能的。

其他几件事:

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

  • 除非您真的知道自己在做什么,否则永远不要尝试在日期/时间上添加/减去偏移量。在大多数情况下,您并没有调整时区,而是实际上选择了不同的时间点。

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

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 2022-12-17
    • 2011-08-30
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多