【问题标题】:Why does javascript has a little or no support for timezones?为什么 javascript 很少或根本不支持时区?
【发布时间】:2015-10-28 11:27:25
【问题描述】:

我正在寻找可以支持时区的 javascript 内容。我的动机是:

  1. 两个时区之间的无缝转换。
  2. 构造具有从毫秒到不同时区的 Date 对象。
  3. 根据不同区域和地区设置日期格式。

目前,我通过从语言环境字符串构造回一个新的 Date 对象来实现 #1:

new Date(dateInSomeTimeZone.toLocaleString('en-US', {timeZone: 'Asia/Calcutta'})

这又很糟糕,因为此 Date 的毫秒表示与原始的不同。也有实现 #3 的方法,但 #2 似乎是“无法实现”。

像 JS 这样成熟的语言为什么不提供大多数框架都支持的这个特性?我知道有像 Moment.js 这样的库在做这些事情,但是在已经运行的应用程序中集成一个新的库并不总是可能的。

上述几点有解决办法吗?

【问题讨论】:

  • 第一个版本的 javascript 是在 10 天内编写的......话虽如此,任何声称 100% 正确获取时区的编程语言都是在骗你
  • 为什么它没有支持?因为事实上在有人添加之前没有任何支持。
  • @Jon 我的意思是如果不添加是一个决定的原因是什么

标签: javascript date datetime timezone


【解决方案1】:

您遇到的主要问题是 JavaScript 是一种客户端脚本语言。这意味着 JavaScript 只使用计算机认为正确的时间。这些时间戳略有不同,因为计算机并不总是与实时完美同步。

对时区的支持非常少,因为您不能总是信任不同计算机上的时区设置。

除了原因之外,您目前已经拥有的解决方案是我建议使用的解决方案。该代码的执行时间可能是个问题,但我认为为此添加一个库会花费更长的时间。

【讨论】:

    【解决方案2】:

    我同意 JavaScript 的原生日期和时间 API 远非理想,moment.js 可能是目前大多数人的最佳答案。

    但是,作为ECMAScript Internationalization API (ECMA-402) 的一部分,一些 事情正在改进。第 1 版的部分内容已经在一些浏览器中实现,目前的第 2 版有望随着时间的推移推出。

    此 API 涵盖了您在问题中使用 toLocaleString 提供的示例。但是,在许多实现中缺乏时区支持。例如,您使用时区 ID 显示,它适用于 Chrome,但不适用于 Internet Explorer。

    此外,ECMA-402 专注于您的第三种情况。其他两个将需要比目前提议的更多的更改。

    至于为什么,请考虑 JavaScript Date 对象的大部分设计与 Java JDK 1.0 中的原始 java.util.Date 相似。当 JDK 1.1 出现时,大部分 API 已被弃用并移至 java.util.Calendar。当您将这两个 Java API 与应用了 ECMA-402 的 JavaScript Date 对象进行比较时,您会发现它们非常相似。

    现在考虑到 Java 开发人员在使用 DateCalendar 对象时仍然存在很多问题,并且从这种挫败感中发展出了 Joda-Time 库。最终,这些概念在Java 8's java.time package 中被采纳和改进。这是一个非常成熟且经过深思熟虑的 API,可能它们是您在 JavaScript 中寻找的东西。人们只能希望 Java 不会像 17 年那样发展。

    AFAIK,在 ES6/2015 或 ES7/2016 中没有此类重大的日期/时间改进。因此,与此同时,它将归结为图书馆。时刻是一个很好的时刻。还有其他好的,也有很多不好的,我相信未来还会有更多。

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2021-11-05
      • 2011-07-05
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多