如何将 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-fns
和 date-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 或计算机的本地时区(如所述)中工作。唯一适用于其他时区的是 toLocaleString
、toLocaleDateString
和 toLocaleTimeString
函数,它们将在 timeZone
选项中接受 IANA 时区标识符。与 toString
函数一样,它们在生成字符串时仅 使用 这个时区。他们不保留它。
简而言之,Date
对象不包含时区,所以你要求的是不可能的。
其他几件事:
不要直接在 Date
对象上调用 console.log
。该行为是未定义的。一些实现 return toString
的值,而其他 return toISOString
.
的值
永远不要尝试 add/subtract 在 date/time 上进行偏移,除非你真的知道自己在做什么。在大多数情况下,您并不是在调整时区,而是实际上选择了不同的时间点。
是的,ISO 8601 时间戳末尾的 Z
表示显示的日期和时间采用 UTC。
嘿,我正在从数据库中接收日期,该数据库将这些日期保存为 UTC。当我用 console.log 打印其中一个日期时,它看起来像这样 2021-04-07T07:00:00.000Z
.
现在我想把它转换成Europe/Berlin
时间。但不是字符串,我希望它是 Javascript Date.
我尝试做的事情
我安装了 date-fns
和 date-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 或计算机的本地时区(如所述)中工作。唯一适用于其他时区的是 toLocaleString
、toLocaleDateString
和 toLocaleTimeString
函数,它们将在 timeZone
选项中接受 IANA 时区标识符。与 toString
函数一样,它们在生成字符串时仅 使用 这个时区。他们不保留它。
简而言之,Date
对象不包含时区,所以你要求的是不可能的。
其他几件事:
不要直接在
的值Date
对象上调用console.log
。该行为是未定义的。一些实现 returntoString
的值,而其他 returntoISOString
.永远不要尝试 add/subtract 在 date/time 上进行偏移,除非你真的知道自己在做什么。在大多数情况下,您并不是在调整时区,而是实际上选择了不同的时间点。
是的,ISO 8601 时间戳末尾的
Z
表示显示的日期和时间采用 UTC。