javascript - 在 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 等,
解决方案
一些东西:
您链接到的答案中的
convertTZ
方法存在缺陷。不应toLocalString
使用Date
构造函数解析输出。请阅读该答案之后的评论。该
Date
对象不能转换到另一个时区,因为它实际上不在任何时区。对象封装的唯一内容Date
是它的 Unix 时间戳,可以通过.valueOf()
、.getTime()
或任何将其强制为Number
. 此类值始终基于 UTC。当您看到来自
Date
对象的本地时间或时区时,系统的本地时区将应用于内部基于 UTC 的 Unix 时间戳以创建输出。本地时区不能通过 JavaScript(或 TypeScript)以编程方式更改,也不能基于每个对象进行更改。不要试图将
Date
一个时区的Date
对象转换为另一个时区的对象,而是要认识到所有Date
对象本质上都是 UTC。因此,您可以创建一个位于不同时区的字符串(例如,使用toLocaleString
该timeZone
选项),但您不能Date
从该字符串创建新对象。如果您想要一个实际上可以设置为不同时区的对象,请考虑Luxon。如果您需要一个没有库的解决方案,您有一天可以使用ZonedDateTime
TC39临时提案中的一个,它最终将成为 ECMAScript 的一部分。谨防调用
console.log
对象Date
。ECMAScript 规范和 WhatWG 控制台规范都没有定义这种调用的行为。这是未定义的行为。在某些环境中,记录的字符串输出与调用对象相同 - 这将提供与对象时间戳等效的本地时间.toString()
,以及本地时区的显示名称。其他环境将显示相同的调用输出,这将提供 UTC 时间戳的 ISO-8601 表示。不要记录对象,而是自己调用这两个函数之一并记录输出。Date
Date
.toISOString()
Date
推荐阅读
- linux-kernel - USB-Serial 在新的 linux(内核 4.12.14)中立即失去连接
- forms - Symfony 4 处理 null DateType 表单字段
- sas - 如何在SAS中的宏下使用日期格式为YYYYMM
- css - 所有边距都相等,但有些边距比其他边距更平等
- java - 如何使用apache camel从soap响应中获取值?
- svg - 如何在角度 6 中使用 svg beginElement()?
- ios - 找出系统默认的 UnitType(升/加仑)
- android - 如何为一个图像视图中的每次单击调用不同的可绘制动画?
- r - 如何通过 TensorFlow 强制 Keras 在 R 中使用 GPU
- angular - Angular如何知道请求是否超时超过三倍?