Предыдущие ответы очень хорошо разъясняют причину проблемы, но я думаю, что также имеет смысл указать, что в Javascript есть методы как "native timezone", так и "UTC": -
var dtnow = new Date();
var val1 = dtnow.getHours();
var val2 = dtnow.getUTCHours();
... Если на компьютере, на котором запущен этот код, есть местный часовой пояс, отличный от GMT (возможно, дневное время в Великобритании - GMT + 01: 00), тогда возвращаемые значения могут отличаться (в зависимости от значения даты, которое выустановил и показывает, будет ли механизм JS возвращать или не возвращать GMT из не-UTC метода - я видел различия, например, в Rhino разница есть.)
Поэтому для целей вычислений выМОЖЕТ пожелать извлечь все значения, используя методы UTC, что гарантирует, что все основано на GMT.Это сделало бы математику «технически правильной», но то, является ли это семантически правильным для данной цели, зависит от варианта использования.
Например, 2:00 в США по сравнению с 2:00 в Великобритании, игнорируя часовые пояса, равно 0.В то время как с часовыми поясами это может быть 6 (например).Иногда я тоже с этим борюсь, и мне часто приходится задумываться о том, чего я пытаюсь достичь, прежде чем идти по тому или иному маршруту!Всегда печет мою лапшу ненадолго: -)