【问题标题】:Get local time representation of Date in arbitrary timezone in arbitrary day - considering Daylight Savings Time在任意日期获取任意时区日期的本地时间表示 - 考虑夏令时
【发布时间】:2014-03-02 15:56:19
【问题描述】:

当然,questions 中的 lotDate objectstimezones 有关,但其中许多是关于将 当前 时间转换为另一个时区等不太清楚自己想做什么。

我想在任意一天的任意时区显示日期、小时、分钟等。例如,我想要一个函数f(t, s)

  • 给定时间戳 1357041600(即 2013/1/1 12:00:00 UTC)和字符串 "America/Los Angeles",将满足以下比较:

    f(1357041600, "America/Los Angeles") == "2013/01/01 04:00:00"
    
  • 给定时间戳 1372680000(2013/07/01 12:00:00 UTC),将满足以下比较:

    f(1357041600, "America/Los Angeles") == "2013/07/01 05:00:00"
    
  • 即使浏览器中的时区是"Europe/London""America/São Paulo",也会始终以这种方式运行。

  • 即使浏览器中的时间是 2014/02/05 19:32 或 2002/08/04 07:12,也会始终以这种方式运行;和

  • 作为最后的限制,不会从服务器端请求任何东西(因为我几乎是自己做的:))

有可能吗?

【问题讨论】:

  • 可以。要么找到一个已经这样做的库,像moments.js 这样的好机会,或者如果你自己做,抓住tz database(又名奥尔森数据库)将数据转换为javascript对象并将其用作函数的查找。
  • 查看我在那个 dup 帖子中的答案,以获得解决这个确切问题的库列表。

标签: javascript date timezone dst


【解决方案1】:

对于支持ECMAScript Internationalization API 并遵守其支持IANA time zone database 的建议的JavaScript 运行时环境,您只需这样做:

new Date(1357041600000).toLocaleString("en-US", {timeZone: "America/Los_Angeles"})

对于其他环境,需要一个库。 There are several listed here.

【讨论】:

    【解决方案2】:

    给定时间戳 1357041600(即 2013/1/1 12:00:00 UTC)

    这似乎是自 UNIX 时代 (1970-01-01T00:00:00Z) 以来的秒数。 Javascript 使用相同的纪元,但以毫秒为单位,以便创建合适的日期对象:

    var d = new Date(timestamp * 1000);
    

    这将创建一个具有合适时间值的 Date 对象。然后,您需要使用IANA time zone database 之类的东西来确定时区偏移量。这可以使用 UTC 方法应用于 Date 对象。例如。将偏移量解析为分钟,然后使用:

    d.setUTCMinutes(d.getUTCMinutes() + offset)
    

    然后可以使用 UTC 方法获取调整后的日期和时间值,以创建您需要的任何格式的字符串:

    var dateString = d.getUTCFullYear() + '/' + pad(d.getUTCMonth() + 1) + '/' ...
    

    其中 pad 是将前导零添加到单个数字值的函数。使用 UTC 方法可以避免本地时区偏移和夏令时差异的任何影响。

    还有像timezone.js 这样的库可以用来确定偏移量,但是我没有使用它们,所以不暗示认可。

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 2019-09-05
      • 2018-02-04
      • 2014-08-03
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2016-07-21
      相关资源
      最近更新 更多