如何计算JavaScript中2个时区的差异?

Hom*_*mer 6 javascript timezone momentjs

例如,东部和中部的差异是1.我的解决方案感觉很糟糕.有更简单/更好的方法吗?

var diff = (parseInt(moment().tz("America/New_York").format("ZZ")) - parseInt(moment().tz("America/Chicago").format("ZZ"))) / 100;
Run Code Online (Sandbox Code Playgroud)

我的例子是使用Momentjs库.

Mat*_*int 16

计算两个任意时区之间差异是不可能的.您只能计算特定时刻的差异.

  • 这是目前伦敦和纽约4之间的小时差(于2015年3月25日写这个).
  • 但是几周之前差异是5小时,而且从现在开始几周就会有5小时差异.
  • 每个时区在不同的时间点切换夏令时的偏移.

在两个时区之间的一般情况下都是如此.但是,某些时区要么同时切换,要么根本不切换.

  • 始终伦敦和巴黎之间的一个小时后,因为他们在同一时刻切换.
  • 总是亚利桑那州和夏威夷之间的3个小时,因为也没有DST.

请记住,在美国,每个使用DST的时区实际上都会在不同的时刻切换.他们都在各自的上午2:00切换本地时间,但不能在同一通用的时间的时刻.

  • 因此芝加哥和纽约之间通常相隔1小时
  • 但是,每年两个短暂的时间段,它们相隔2小时,或者具有相同的确切时间.

另请参阅timezone标记wiki "Time Zone!= Offset" .

现在关于时刻 - 时区,你在评论中说:

Web服务器位于东部时区; 我们在中环.我需要用户时区和服务器的区别.

Web服务器的时区无关紧要.您应该能够在世界任何地方托管而不会影响您的应用程序.如果你做不到,那你做错了.

可以得到当前的时间差时区(美国中部时间)和用户.如果代码在浏览器中运行,您甚至不需要知道用户的确切时区:

var now = moment();
var localOffset = now.utcOffset();
now.tz("America/Chicago"); // your time zone, not necessarily the server's
var centralOffset = now.utcOffset();
var diffInMinutes = localOffset - centralOffset;
Run Code Online (Sandbox Code Playgroud)

相反,如果代码是在服务器上运行(在node.js的应用程序),那么你需要知道用户的时区.只需像这样更改第一行:

var now = moment.tz("America/New_York"); // their time zone
Run Code Online (Sandbox Code Playgroud)

  • 干得好!需要注意的是:`const hour = map.get('hour');`有时会返回“24”,这会产生无效的 iso 字符串。它需要一个“小时= =”24“?“00”:小时;`检查放置在某处以修复它。顺便说一句,这是 Node v12+ 的情况。此外,对结果进行四舍五入也没有什么坏处。我遇到一些烦人的单元测试失败,因为“-0!== 0”。 (2认同)