Заставить Moment.js format () игнорировать переход на летнее время JS - PullRequest
0 голосов
/ 06 июля 2018

Я в настоящее время нахожусь в PST в -07:00 от UTC.

Если я сделаю это: moment().format('Z') Я правильно получу -07:00. Есть ли способ (просто) заставить moment.format () игнорировать переход на летнее время (и в моем случае дать мне -08:00)?

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Я думаю, вам нужно будет получить смещение от временной метки не-DST, а затем изменить строки.

Если предположить, что дата какого-то типа, то вы получите строку со значением date + DST-ignorant-offset:

function _noDST(noDST, dateStr){
    var beginningOfTimeNoDST = moment(noDST); // whatever target you know has no DST
    var d = moment(dateStr);
    var noOffset = d.format('YYYY-MM-DDTHH:mm:ss');
    var offset = beginningOfTimeNoDST.format('Z');
    return [noOffset, offset].join("");
}
0 голосов
/ 08 марта 2019

Следующий код сделает то, что вы просили:

// First we need to get the standard offset for the current time zone.
// Since summer and winter are at opposite times in northern and summer hemispheres,
// we will take a Jan 1st and Jul 1st offset.  The standard offset is the smaller value
// (If DST is applicable, these will differ and the daylight offset is the larger value.)
var janOffset = moment({M:0, d:1}).utcOffset();
var julOffset = moment({M:6, d:1}).utcOffset();
var stdOffset = Math.min(janOffset, julOffset);

// Then we can make a Moment object with the current time at that fixed offset
var nowWithoutDST = moment().utcOffset(stdOffset);

// Finally, we can format the object however we like. 'Z' provides the offset as a string.
var offsetAsString = nowWithoutDST.format('Z');

Однако: Вы, вероятно, должны спросить себя почему вы хотите это сделать. В подавляющем большинстве случаев игнорирование DST, когда оно действительно действует, является ошибкой. У ваших пользователей нет выбора, использовать ли они DST. Если это применимо в их местном часовом поясе, то ваш код также должен это учитывать. Не пытайтесь победить его.

С другой стороны, если вы просто отображаете время или смещение без DST для информационных целей, это, вероятно, приемлемо.

0 голосов
/ 06 июля 2018

Это должно вычесть час во время летнего времени, если это то, что вы хотите.

moment().subtract(moment().isDST() ? 1 : 0, ‘hours’).format('Z')

Обновление: как отмечено в комментариях, это работает только в тех случаях, когда вы знаете, что часовой пояс на 1 час вперед во время летнего времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...