首页 > 解决方案 > 在 JavaScript 中将日期转换为另一个时区并使用正确的时区打印

问题描述

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

例如,如果用户在夏威夷

代码:取自https://stackoverflow.com/a/54127122/15358601

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")

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

它仍然打印与夏威夷的决赛。我需要美国/洛杉矶展览,而不是夏威夷。(但是它仍然打印正确的新小时和分钟,只是显示标签不正确)如何做到这一点?

结果图片

该解决方案也适用于其他时区,分别打印它的其他时区,例如:America/New_York、Europe/London、Europe/Paris 等,

标签: javascripttypescripttimezone

解决方案


一些东西:

  • 您链接到的答案中的convertTZ方法存在缺陷。不应toLocalString使用Date构造函数解析输出。请阅读该答案之后的评论。

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

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

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

  • 谨防调用console.log对象Date。ECMAScript 规范和 WhatWG 控制台规范都没有定义这种调用的行为。这是未定义的行为。在某些环境中,记录的字符串输出与调用对象相同 - 这将提供与对象时间戳等效的本地时间.toString(),以及本地时区的显示名称。其他环境将显示相同的调用输出,这将提供 UTC 时间戳的 ISO-8601 表示。不要记录对象,而是自己调用这两个函数之一并记录输出。DateDate.toISOString()Date


推荐阅读