13

I would like to get the timezone difference between New York and Hong Kong with Node.js moment module. I have done some preliminary work.

var NewYork_time_hr = moment().tz("America/New_York").format('HH'); 
var HongKong_time_hr = moment().tz("Asia/Hong_Kong").format('HH');

I can then proceed to write a function to calculate the difference between the 2 timezones in hours. I was hoping for a simpler method.

Is there a more elegant and simpler way to do it with moment library?

guagay_wk
  • 26,337
  • 54
  • 186
  • 295

1 Answers1

25

Not sure about "simpler", but more correct (since not all timezones are a full hour from each other):

// get the current time so we know which offset to take (DST is such bullkitten)
var now = moment.utc();
// get the zone offsets for this time, in minutes
var NewYork_tz_offset = moment.tz.zone("America/New_York").offset(now); 
var HongKong_tz_offset = moment.tz.zone("Asia/Hong_Kong").offset(now);
// calculate the difference in hours
console.log((NewYork_tz_offset - HongKong_tz_offset) / 60);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.4.1/moment-timezone-with-data-2010-2020.min.js"></script>
Amadan
  • 191,408
  • 23
  • 240
  • 301
  • Upvoted and selected as answer. I don't quite understand why the need for `var now = moment.utc();`? Why not just get `NewYork_time_hr` offset of `HongKong_time_hr`? – guagay_wk Nov 13 '15 at 02:55
  • 4
    The comment above it was a hint - timezone offsets change throughout the year, and [not all at the same time](https://en.wikipedia.org/wiki/Daylight_saving_time_by_country). The difference between Hong Kong (has no DST) and New York (has DST) is different depending on whether you're asking in summer or in winter. And you can't just use `hr` because, e.g. Calcutta is offset at +05:30. – Amadan Nov 13 '15 at 04:12
  • 1
    Great answer. Though it will also work if you just pass `moment()` instead of `moment.utc()`. It still gets evaluated as the same UTC-based timestamp regardless of which form you pass. +1 about the result being different depending on when you call it. "How many hours between New York and Los Angeles?" (Usually 3, but sometimes 2 and sometimes 4.) – Matt Johnson-Pint Nov 13 '15 at 04:56
  • 4
    FYI, the other way to obtain an offset is `moment(now).tz("America/New_York").utcOffset()`, but either way is fine. You still have to subtract them manually. – Matt Johnson-Pint Nov 13 '15 at 04:58