Date.setDate, обеспечивающий согласованное время (режим?) DST против стандарта - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть эта функция, которая возвращает новый экземпляр Date с количеством дней, добавленных или вычтенных из переданного Date объекта.

function daysFrom(date, numDays) {
    var retDate = new Date();
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}

Но сейчас (в тихоокеанском часовом поясе), если я пропущу дату с 19 сентября 2018 года, мои две даты будут несовместимы по стандартному и летнему времени.

var endDate = new Date(Date.parse('19 September 2018 00:12:00 GMT'));
var startDate = daysFrom(endDate, -5);

console.log(startDate, endDate);
// Tue Sep 18 2018 17:12:00 GMT-0700 (Pacific Daylight Time) Tue Nov 13 2018 20:05:02 GMT-0800 (Pacific Standard Time)

Полагаю, они будут другими, потому что моя возвращаемая дата была создана сегодня, так как мы не в летнее время, но как проще всего убедиться, что возвращаемая дата является правильным режимом для времени года? В 2019 году летнее время начнется 10 марта, поэтому, если я вычту x количество дней из этого, я буду ожидать, что режим времени (как бы он ни назывался) был стандартным, а не летним.

А как называется режим (DST vs Standard)?

Использование текущей версии браузера Chrome.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вам необходимо клонировать конечную дату, а не инициализировать ее текущей датой:

function daysFrom(date, numDays) {
    var retDate = new Date(date.getTime());
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}

var endDate = new Date(Date.parse('19 September 2018 00:12:00 GMT'));
var startDate = daysFrom(endDate, -5);

console.log(startDate, endDate);

Что касается строкового представления по умолчанию для объекта даты, оно зависит от реализации (до ECMAScript 2018), поэтому на усмотрение вашего браузера.

С MDN :

До ECMAScript 2018 (редакция 9) формат строки, возвращаемой Date.prototype.toString, зависел от реализации.Следовательно, нельзя полагаться на указанный формат.

0 голосов
/ 19 ноября 2018

... но какой самый простой способ убедиться, что возвращаемая дата является правильным режимом для времени года?В 2019 году летнее время начнется 10 марта, поэтому, если я вычту из этого число дней x, я буду ожидать, что режим времени (как бы он ни назывался) был стандартным, а не летним.

нет «режима», объекты Date не имеют смещения часового пояса.Смещение поступает из хост-системы на дату, когда getTimezoneOffset включен, оно не сохраняется с датой.

До недавнего времени реализации применяли текущие настройки смещения часового пояса, как если бы они всегдасуществовала.Однако в ECMAScript 2015 было рекомендовано поддерживать исторические изменения, а в ECMAScript 2018 требуется, чтобы они отражали исторические изменения как можно точнее.Это изменение не было полностью реализовано во всех реализациях, поэтому вы можете получить различия, когда правила смещения или перехода на летнее время изменились по сравнению с теми, которые в настоящее время реализованы.

И как называется режим (DST противСтандартный)?

ECMAScript относится к «летнему времени» и «настройке местного часового пояса», но также говорит «местное стандартное время» при явном различении между локальным (стандартным)время и летнее время.

В более общем смысле типичное летнее смещение называется «летнее время» или «летнее время», а все остальное - «стандартное время».Не существует стандартизации имен часовых поясов (проверьте несколько браузеров, они повсюду), поэтому все будет делать, пока это согласованно и не неоднозначно.

0 голосов
/ 19 ноября 2018

Я думаю, вы хотите инициализировать retDate на сегодняшний день?

function daysFrom(date, numDays) {
    var retDate = new Date(date);
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...