在 JavaScript 中将日期转换为另一个时区并使用正确的时区进行打印

Mar*_*512 1 javascript timezone typescript

我需要将当地时区转换为太平洋/洛杉矶。

例如,如果用户在夏威夷

代码:取自/sf/answers/3788898571/

function convertTZ(date, tzString) {
    return new Date((typeof date === "string" ? New Date(date) : date).toLocaleString("en-US", {timeZone: tzString}));   
}

convertTZ(new Date(), "America/Los_Angeles")
Run Code Online (Sandbox Code Playgroud)

2021 年 3 月 14 日星期日 17:01:59 GMT-1000(夏威夷-阿留申标准时间){}

它仍然打印着夏威夷的决赛。我需要美国/洛杉矶显示器,而不是夏威夷。(但是它仍然打印正确的新小时和分钟,只是显示标签不正确)这该怎么办?

结果图片

该解决方案也应该适用于其他时区,分别打印其他时区,例如:美国/纽约、欧洲/伦敦、欧洲/巴黎等,

Mat*_*int 5

一些东西:

  • 您链接到的答案中的方法convertTZ是有缺陷的。toLocalString人们不应该解析构造函数的输出Date。请阅读该答案后面的评论。

  • Date对象无法转换为另一个时区,因为它实际上并不位于任何时区。对象封装的唯一内容Date是它的 Unix 时间戳,可以通过.valueOf().getTime()或任何将其强制为Number. 此类值始终基于 UTC。

  • 当您看到来自对象的本地时间或时区时Date,系统的本地时区将应用于基于 UTC 的内部 Unix 时间戳以创建输出。本地时区无法通过 JavaScript(或 TypeScript)以编程方式更改,也不能基于每个对象进行更改。

  • 不要尝试将Date一个时区的对象转换为Date另一个时区的对象,而是认识到所有Date对象本质上都是 UTC。因此,您可以创建位于不同时区的字符串toLocaleString(例如,与timeZone选项一起使用),但无法Date从该字符串创建新对象。如果您想要一个实际上可以设置为不同时区的对象,请考虑Luxon。如果您需要一种没有库的解决方案,有一天您将能够使用TC39 临时提案ZonedDateTime中的一个,它最终将成为 ECMAScript 的一部分。

  • 请注意调用console.log对象Date。ECMAScript 规范和 WhatWG Console 规范都没有定义此类调用的行为。这是未定义的行为。.toString()在某些环境中,记录的字符串输出与调用对象相同Date- 这将给出对象时间戳的本地时间Date,以及本地时区的显示名称。其他环境将显示相同的调用输出.toISOString(),这将给出 UTC 时间戳的 ISO-8601 表示形式。您可以Date自己调用这两个函数之一并记录输出,而不是记录对象。