Проблемы с часовым поясом при расчете разницы между двумя датами в JavaScript - PullRequest
1 голос
/ 11 сентября 2011

Я использую следующее для вычисления разницы между двумя датами в JavaScript:

var dateOne = new Date; // Now
var dateTwo = new Date( dateOne.getTime() + 60 * 1000 ); // Now + One Minute
var difference = new Date( dateTwo - dateOne );

Итак, по логике вещей, difference должно составлять одну минуту. Но Firebug говорит мне, что разница составляет один час, и часовой пояс как-то тоже меняется!

 dateOne = Date {Sun Sep 11 2011 01:07:55 GMT+0200 (CET)}
 dateTwo = Date {Sun Sep 11 2011 01:08:55 GMT+0200 (CET)}
 difference = Date {Thu Jan 01 1970 01:01:00 GMT+0100 (CET)}

Как я могу это исправить?

Ответы [ 4 ]

4 голосов
/ 11 сентября 2011

Date предназначен для хранения точных дат и времени, а не различий между датами и временем.Вычитание этих Date объектов дает число миллисекунд между этими двумя датами.Затем вы создаете новый Date с таким количеством миллисекунд с начала эпохи.Поскольку эпоха наступила в полночь 1 января 1970 года, результатом будет 12:01 утра 1 января 1970 года. Переход на летнее время несколько меняет часовой пояс.

2 голосов
/ 11 сентября 2011

В JavaScript все время в GMT. Каждый раз, когда вы конвертируете Date в строку, часовой пояс «применяется» к выводу. Таким образом, вы можете попытаться получить разницу в миллисекундах:

difference = dateTwo.getTime() - dateOne.getTime()

Это, очевидно, 60000, так как вы добавили это.

Нет класса TimeSpan или чего-то еще. Только даты хранят даты.

EDIT:
Если вам было интересно, почему был выходной сигнал +2: 00 часов, а затем просто +1: 00, это потому, что 1 января в стандартном времени, а 11 сентября - в летнее время. Это не потому, что JavaScript делает что-то смешное, вычитая одну дату из другой.

1 голос
/ 28 февраля 2014

Предыдущие ответы очень хорошо разъясняют причину проблемы, но я думаю, что также имеет смысл указать, что в 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 (например).Иногда я тоже с этим борюсь, и мне часто приходится задумываться о том, чего я пытаюсь достичь, прежде чем идти по тому или иному маршруту!Всегда печет мою лапшу ненадолго: -)

0 голосов
/ 13 июля 2016

Вы можете рассчитать разницу дней полного доказательства между двумя датами, расположенными в TZ, по следующей формуле:

var start = new Date('10/3/2015');
            var end = new Date('11/2/2015');
            var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
            // actually its 30 ; but due to daylight savings will show 31.0xxx
            // which you need to offset as below
            days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...