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

时间:2015-03-25 20:00:11

标签: javascript timezone momentjs

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

var diff = (parseInt(moment().tz("America/New_York").format("ZZ")) - parseInt(moment().tz("America/Chicago").format("ZZ"))) / 100;

我的示例是使用Momentjs库。

2 个答案:

答案 0 :(得分:14)

无法计算两个任意时区之间的 差异。您只能计算特定时刻的差异

  • 目前伦敦和纽约之间有4小时差异(2015年3月25日写完)。
  • 但是几个星期之前有5个小时的差异,从现在起几周就会有5个小时。
  • 每个时区都会在不同的时间点切换夏令时的偏移。

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

  • 伦敦和巴黎之间的总是一小时,因为它们会在同一时刻切换。
  • 亚利桑那州和夏威夷之间总是 3小时,因为两者都没有夏令时。

请记住,在美国,每个使用DST的时区实际上都会在不同的时刻切换。它们都在凌晨2点在本地时间切换,但不会在同一时间通用时刻切换。

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

另请参阅the timezone tag wiki中的“时区!=偏移”。

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

  

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

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;

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

var now = moment.tz("America/New_York"); // their time zone

答案 1 :(得分:0)

由于诸如夏令时(dst)之类的东西,两个时区之间的时差只能在特定时间测量。

但是,对于特定日期,下面的代码应该可以工作。

function getOffsetBetweenTimezonesForDate(date, timezone1, timezone2) {
  const timezone1Date = convertDateToAnotherTimeZone(date, timezone1);
  const timezone2Date = convertDateToAnotherTimeZone(date, timezone2);
  return timezone1Date.getTime() - timezone2Date.getTime();
}

function convertDateToAnotherTimeZone(date, timezone) {
  const dateString = date.toLocaleString('en-US', {
    timeZone: timezone
  });
  return new Date(dateString);
}

偏移量/差异以毫秒为单位

然后您要做的就是:

const offset = getOffsetBetweenTimezonesForDate(date, 'America/New_York', 'America/Chicago');