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

在JavaScript中将日期转换为另一个时区,并使用正确的时区打印,javascript,typescript,timezone,Javascript,Typescript,Timezone,我需要将本地时区转换为太平洋/洛杉矶 例如,如果用户在夏威夷 代码:取自此处 2021年3月14日星期日17:01:59 GMT-1000(夏威夷阿留申标准时间){} 它仍然打印夏威夷的决赛。我需要的是美国/洛杉矶的展览,不是夏威夷。(但是它仍然打印正确的新小时和分钟,只是显示标签不正确) 如何做到这一点 该解决方案也适用于其他时区,根据您的要求分别打印其其他时区,例如:美国/纽约、欧洲/伦敦、欧洲/巴黎等, function convertTZ() { return new Date

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

例如,如果用户在夏威夷

代码:取自此处

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

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

该解决方案也适用于其他时区,根据您的要求分别打印其其他时区,例如:美国/纽约、欧洲/伦敦、欧洲/巴黎等,
function convertTZ() {
    return new Date().toLocaleString('en-US', { timeZone: "America/Los_Angeles" });
}
console.log(convertTZ());

//Second way
//Hoepfully that's going to be the code that you need.You can change the way that you want to see the date.
function convertTZ() {
    return new Date().toLocaleString('en-US', {
    timeZone: "America/Los_Angeles" ,
  day: "numeric",
  month: "short",
  year: "numeric",
  hour: "numeric",
  minute: "2-digit"
});
}
console.log(convertTZ(),' America/Los Angeles');
将有助于实现这一目标。

以下几点:

  • 您为
    convertz
    链接的答案中的方法存在缺陷。不应使用
    Date
    构造函数分析
    toLocalString
    的输出。请阅读回答后的评论

  • Date
    对象无法转换为其他时区,因为它实际上不在任何时区中。
    Date
    对象封装的唯一内容是它的Unix时间戳,可以通过
    .valueOf()
    .getTime()
    或任何将其强制为
    数字的机制来查看。此类值始终基于UTC

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

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

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


它将其显示为字符串而不是日期,并且不显示America/Los Angeles您现在可以删除此答案吗?如果Mozilla是标准化的,并且能够在Chrome、Edge和Angular 11中正常工作,那么我对它持开放态度,谢谢你也能生成工作代码吗?谢谢谢谢这真的很有帮助,最后一个问题,这个答案能解释夏令时吗?返回新日期((typeof Date==“string”?新日期(Date):Date).toLocaleString(“en-US”{timeZone:tzString}))
toLocaleString
在创建字符串时执行,但是
new Date(…)
在解析该字符串时将使用本地时区的偏移量和DST规则。这就是为什么你不应该使用这种方法。这是我真正的目标问题,也许你可以帮忙,谢谢,
function convertTZ() {
    return new Date().toLocaleString('en-US', { timeZone: "America/Los_Angeles" });
}
console.log(convertTZ());

//Second way
//Hoepfully that's going to be the code that you need.You can change the way that you want to see the date.
function convertTZ() {
    return new Date().toLocaleString('en-US', {
    timeZone: "America/Los_Angeles" ,
  day: "numeric",
  month: "short",
  year: "numeric",
  hour: "numeric",
  minute: "2-digit"
});
}
console.log(convertTZ(),' America/Los Angeles');