【问题标题】:what method can I use to get the timezone abbreviation in all browsers?我可以使用什么方法在所有浏览器中获取时区缩写?
【发布时间】:2016-02-14 11:35:07
【问题描述】:

在 Chrome、Safari 和 Firefox 中,我使用这样的调用:

var date = new Date();
date.toTimeString().match(/\((.*)\)/)

但这在 IE 9 中不起作用,因为 IE 9 返回的数据没有括号。这在 IE 11 中不起作用,因为 IE 11 不返回缩写,而是返回类似(太平洋标准时间)的内容。

IE9-IE10 输出示例:

"15:38:43 PST"

IE11 和 Edge 输出示例:

"15:36:07 GMT-0800 (Pacific Standard Time)"

【问题讨论】:

  • Date.prototype.toTimeString 返回的字符串完全依赖于实现,它根本不需要包含任何时区信息。
  • 你签出momentjs了吗?已经存在一段时间并被很多人使用。如果您不想使用该库,请查看源代码。这是最近的一个 SO 问题,如果你走 momentjs 路线,这可能是你所问的问题。 stackoverflow.com/questions/28374901/…

标签: javascript date timestamp


【解决方案1】:

一些背景:

  • 时区名称及其缩写并未正式标准化,但有许多方案已被广泛采用并可能被视为事实上的标准(例如IANA time zone database
  • 浏览器在国际化方面是出了名的糟糕,例如IE 和 Chrome 将澳大利亚东部的时间报告为“澳大利亚东部标准时间”,而该时间更广泛地称为“澳大利亚东部标准时间”
  • 某些时区方案没有每个时区的唯一标识符,例如EST 可能适用于 3 个不同的区域。
  • toTimeString 返回的值完全依赖于实现,因此它可能根本不包含任何时区信息,即使包含,也可能不是用户期望的(见上文)

有各种库根据Date.prototype.getTimezoneOffset 返回的时区偏移量确定可能的时区,并测试 2 个日期以查看是否使用夏令时(例如 jsTimezoneDetect),但大多数基于 IANA 时间区域数据库。

所以重新表述你的问题:

有没有可靠的方法获取主机时区缩写

答案是否定的。

但是,如果您准备接受派生的 IANA 时区名称并将它们映射到您希望采用的任何其他方案,那么使用库将非常接近。

【讨论】:

【解决方案2】:

MomentJS Timezone:

moment.tz([2012, 0], 'America/New_York').format('z');    // EST
moment.tz([2012, 5], 'America/New_York').format('z');    // EDT
moment.tz([2012, 0], 'America/Los_Angeles').format('z'); // PST
moment.tz([2012, 5], 'America/Los_Angeles').format('z'); // PDT

【讨论】:

  • Moment.js(和类似的库)只能根据偏移量以及是否遵守夏令时来猜测时区。但是,可能有多个时区满足特定的偏移量/DST 组合。
  • @RobG 这真的是图书馆特有的吗?似乎更像是 javascript 浏览器实现的症状。如果您知道一种不会猜测的原生 js 跨浏览器兼容方式,则最感兴趣:)
  • @hubsonbropa — 图书馆只能使用 timezoneOffset,然后通过 6 月和 1 月的测试日期确定是否观察到 DST,这也告诉他们北半球/南半球。但就是这样。它实际上是相当可靠的,但不是 100%(例如,如果没有观察到夏令时,他们就无法分辨半球)。
【解决方案3】:

试试

Intl.DateTimeFormat().resolvedOptions().timeZone

Waring:不兼容所有浏览器版本

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多