javascript - 如何将 JavaScript 日期初始化为特定时区

标签 javascript timezone

我在特定时区有日期时间作为字符串,我想将其转换为本地时间。但是,我不知道如何在 Date 对象中设置时区。

例如,我有 Feb 28 2013 7:00 PM ET,那么我可以

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

据我所知,我可以设置 UTC 时间或本地时间。但是,如何在另一个时区设置时间?

我尝试使用加/减 UTC 的偏移量,但我不知道如何应对夏令时。我不确定我是否朝着正确的方向前进。

如何在javascript中将时间从不同时区转换为本地时间?

最佳答案

背景
JavaScript 的 Date对象在内部跟踪 UTC 时间,但通常接受输入并在运行它的计算机的本地时间产生输出。它几乎没有在其他时区处理时间的设施。Date 的内部表示object 是单个数字,表示自 1970-01-01 00:00:00 UTC 以来经过的毫秒数,不考虑闰秒。
Date 对象本身没有存储时区或字符串格式。
Date的各种功能对象被使用时,计算机的本地时区被应用于内部表示。如果该函数产生一个字符串,则可以考虑计算机的区域信息以确定如何产生该字符串。细节因功能而异,有些是特定于实现的。
唯一的操作Date可以使用非本地时区的对象是:

  • 它可以解析包含来自任何时区的数字 UTC 偏移量的字符串。它使用它来调整正在解析的值,并存储等效的 UTC。原始本地时间和偏移量不会保留在结果 Date 中目的。例如:
      var d = new Date("2020-04-13T00:00:00.000+08:00");
      d.toISOString()  //=> "2020-04-12T16:00:00.000Z"
      d.valueOf()      //=> 1586707200000  (this is what is actually stored in the object)
    
  • 在已实现 ECMASCript Internationalization API 的环境中(又名“国际”),Date对象可以生成一个特定于区域设置的字符串,该字符串调整为给定的时区标识符。这是通过 timeZone 完成的。 toLocaleString 的选项及其变体。大多数实现将支持 IANA 时区标识符,例如 'America/New_York' .例如:
      var d = new Date("2020-04-13T00:00:00.000+08:00");
      d.toLocaleString('en-US', { timeZone: 'America/New_York' })
      //=> "4/12/2020, 12:00:00 PM"
      // (midnight in China on Apring 13th is noon in New York on April 12th)
    
    大多数现代环境都支持全套 IANA 时区标识符 (see the compatibility table here)。但是,请记住,需要 Intl 支持的唯一标识符是 'UTC'。 ,因此您应该仔细检查是否需要支持较旧的浏览器或非典型环境(例如,轻量级物联网设备)。

  • 图书馆
    有几个库可用于处理时区。尽管他们仍然无法制作 Date对象的行为有所不同,它们通常实现标准 IANA 时区数据库并提供在 JavaScript 中使用它的函数。现代库使用由 Intl API 提供的时区数据,但较旧的库通常会产生开销,尤其是在 Web 浏览器中运行时,因为数据库可能会变得有点大。其中一些库还允许您有选择地减少数据集,无论是支持哪些时区和/或您可以使用的日期范围。
    以下是要考虑的库:
    国际图书馆
    新开发应该从这些实现中选择一种,它们依赖于 Intl API 来获取时区数据:
  • Luxon (Moment.js 的继任者)
  • date-fns-tz (date-fns 的扩展名)

  • 非国际图书馆
    这些库得到维护,但承担着打包自己的时区数据的负担,这些数据可能非常大。
  • js-joda/timezone (js-joda 的扩展名)
  • moment-timezone *(Moment.js 的扩展名)
  • date-fns-timezone (旧 1.x 的 date-fns 的扩展名)
  • BigEasy/TimeZone
  • tz.js

  • * 虽然之前推荐 Moment 和 Moment-Timezone,但 Moment 团队现在更喜欢用户选择 Luxon 进行新开发。
    已停产的库
    这些库已正式停产,不应再使用。
  • WallTime-js
  • TimeZoneJS

  • future 提案
    TC39 Temporal Proposal旨在提供一组新的标准对象,用于在 JavaScript 语言本身中处理日期和时间。这将包括对时区感知对象的支持。

    关于javascript - 如何将 JavaScript 日期初始化为特定时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44623824/

    相关文章:

    java - 在 Java 中将日期转换为新的时区

    javascript - style.height 不工作 javascript

    javascript - 使用 audio.srcObject 和 MediaStream 播放来自 ajax 调用的音频

    javascript - 如何使用 Javascript SDK 调用带有参数的云代码函数

    java - Android如何获取设备时间而不是时区时间

    javascript - 不同时区不同设备上的 Unix 时间

    javascript - NeuQuant.js(JavaScript 颜色量化)隐藏 JS 转换的 bug

    javascript - 这个 Ember.js handlebars if 语句有什么问题?

    elasticsearch - 如何为日志设置当前时间(-zone)?

    java - UTC Unix 时间戳存储在错误时区的 Java 程序中的 HSQLDB 中