为什么 javascript 对时区的支持很少或根本不支持?
Why does javascript has a little or no support for timezones?
我在 javascript 中寻找可以支持时区的东西。我的动机是:
- 两个时区之间的无缝转换。
- 从毫秒构造具有不同时区的日期对象。
- 根据不同的区域和区域设置格式化日期。
目前我正在通过从语言环境字符串构造回一个新的 Date 对象来实现#1:
new Date(dateInSomeTimeZone.toLocaleString('en-US', {timeZone: 'Asia/Calcutta'})
这又很糟糕,因为此日期的毫秒表示与原始日期不同。也有实现#3 的方法,但#2 似乎是 'Not achievable'.
为什么像JS这样成熟的语言不提供大多数框架都支持的功能?我知道有像 Moment.js 这样的库在做这些事情,但是在已经 运行 的应用程序中并不总是可以集成一个新的库。
以上几点有解决办法吗?
您 运行 遇到的主要问题是 JavaScript 是一种客户端脚本语言。这意味着 JavaScript 只使用计算机认为正确的时间。这些时间戳会略有不同,因为计算机并不总是与实时完美同步。
对时区的支持非常少,因为您不能总是信任不同计算机上的时区设置。
抛开原因,我建议您使用您目前已有的解决方案。该代码的执行时间可能是个问题,但我认为为此添加一个库需要更长的时间。
我同意 JavaScript 的原生日期和时间 API 远非理想,moment.js 可能是目前大多数人的最佳答案。
但是,作为 ECMAScript Internationalization API (ECMA-402) 的一部分,一些 方面正在改进。第一版的部分内容已经在一些浏览器中实现,当前的第二版有望随着时间的推移推出。
您在问题中给出的示例,使用 toLocaleString
包含在这个 API 中。但是,许多实现中都缺乏时区支持。例如,您展示了使用时区 ID,它适用于 Chrome 但不适用于 Internet Explorer。
此外,ECMA-402 专注于您的第三种情况。其他两个将需要比当前提议更多的更改。
至于 为什么 ,请考虑 JavaScript Date
对象的大部分设计与来自 Java的JDK 1.0。当 JDK 1.1 出现时,其中大部分 API 被弃用并移至 java.util.Calendar
。当您将两个 Java API 与应用了 ECMA-402 的 JavaScript Date
对象进行比较时,您会发现它们非常相似。
现在考虑 Java 开发人员在 Date
和 Calendar
对象方面仍然存在很多问题,并且从这种挫败感中成长为 Joda-Time library. Then eventually, those concepts were adopted and improved on in Java 8's java.time
package。这是一个 非常 成熟和深思熟虑的 API,并且可能是您在 JavaScript 中寻找的东西类型。人们只能希望它不会花费 Java 的 17 年时间来进化。
AFAIK,在 ES6/2015 中或计划在 ES7/2016 中没有此类重大 date/time 改进。所以与此同时,它会归结为图书馆。片刻是美好的。还有其他好的,也有很多不好的,我相信将来会有更多。
我在 javascript 中寻找可以支持时区的东西。我的动机是:
- 两个时区之间的无缝转换。
- 从毫秒构造具有不同时区的日期对象。
- 根据不同的区域和区域设置格式化日期。
目前我正在通过从语言环境字符串构造回一个新的 Date 对象来实现#1:
new Date(dateInSomeTimeZone.toLocaleString('en-US', {timeZone: 'Asia/Calcutta'})
这又很糟糕,因为此日期的毫秒表示与原始日期不同。也有实现#3 的方法,但#2 似乎是 'Not achievable'.
为什么像JS这样成熟的语言不提供大多数框架都支持的功能?我知道有像 Moment.js 这样的库在做这些事情,但是在已经 运行 的应用程序中并不总是可以集成一个新的库。
以上几点有解决办法吗?
您 运行 遇到的主要问题是 JavaScript 是一种客户端脚本语言。这意味着 JavaScript 只使用计算机认为正确的时间。这些时间戳会略有不同,因为计算机并不总是与实时完美同步。
对时区的支持非常少,因为您不能总是信任不同计算机上的时区设置。
抛开原因,我建议您使用您目前已有的解决方案。该代码的执行时间可能是个问题,但我认为为此添加一个库需要更长的时间。
我同意 JavaScript 的原生日期和时间 API 远非理想,moment.js 可能是目前大多数人的最佳答案。
但是,作为 ECMAScript Internationalization API (ECMA-402) 的一部分,一些 方面正在改进。第一版的部分内容已经在一些浏览器中实现,当前的第二版有望随着时间的推移推出。
您在问题中给出的示例,使用 toLocaleString
包含在这个 API 中。但是,许多实现中都缺乏时区支持。例如,您展示了使用时区 ID,它适用于 Chrome 但不适用于 Internet Explorer。
此外,ECMA-402 专注于您的第三种情况。其他两个将需要比当前提议更多的更改。
至于 为什么 ,请考虑 JavaScript Date
对象的大部分设计与来自 Java的JDK 1.0。当 JDK 1.1 出现时,其中大部分 API 被弃用并移至 java.util.Calendar
。当您将两个 Java API 与应用了 ECMA-402 的 JavaScript Date
对象进行比较时,您会发现它们非常相似。
现在考虑 Java 开发人员在 Date
和 Calendar
对象方面仍然存在很多问题,并且从这种挫败感中成长为 Joda-Time library. Then eventually, those concepts were adopted and improved on in Java 8's java.time
package。这是一个 非常 成熟和深思熟虑的 API,并且可能是您在 JavaScript 中寻找的东西类型。人们只能希望它不会花费 Java 的 17 年时间来进化。
AFAIK,在 ES6/2015 中或计划在 ES7/2016 中没有此类重大 date/time 改进。所以与此同时,它会归结为图书馆。片刻是美好的。还有其他好的,也有很多不好的,我相信将来会有更多。