Момент isSameOr после неправильного расчета - PullRequest
0 голосов
/ 28 августа 2018

Не уверен, что у меня есть правильные параметры, синтаксис или я просто не использую его правильно, но при использовании «isSameOrAfter» при проверке, является ли текущее время даты utc после того, как дата возвращается в ложь, когда она должна быть истинной .

var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
// oneDayBefore should now be 8/27/2018 7:30:00 PM
if (moment().utc().isSameOrAfter(oneDayBefore, 'day')) {
alert('is same or after')
};

ОБНОВЛЕНИЕ - Я думаю, что я это исправил, но, пожалуйста, посоветуйте, если это лучший способ проверить, является ли текущее время даты момента utc таким же или после того, что я прошел - 1 день

moment().utcOffset((moment().utcOffset() * -1)).isSameOrAfter(oneDayBefore, 'day')

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Это проблема часового пояса. Ваш oneDayBefore использует местный часовой пояс по умолчанию:

var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');

тогда как момент, когда вы сравниваете его, использует UTC:

moment().utc().isSameOrAfter(oneDayBefore, 'day')
//      ^^^^^^

Проблема станет яснее, если вы проверите .format() каждого из них. Например, в моем часовом поясе (CST) я вижу:

const utcDateTime = "8/28/2018 7:30:00 PM";
const oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
console.log(oneDayBefore.format());

// 2018-08-27T19:30:00-05:00
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

В моем часовом поясе полночь UTC в 19:00 по местному времени. Итак, 19:30 по местному времени фактически соответствует 00:30 на следующий день по UTC.

Таким образом, когда вы звоните

moment().utc().isSameOrAfter

, который сравнивает текущее время / день в формате UTC с любым временем, которое ваше "8/28 7:30:00 PM" минус один день соответствует по местному времени . Но, 27 августа 19:30 по местному времени может быть 8:28 по времени UTC - следовательно, вы сравниваете moment().utc() (на момент написания, 27 августа, 23:45) с 28 августа, 00:30 ( или что-то подобное - это зависит от вашего часового пояса).

Вероятно, лучше использовать как можно больше внутреннего времени UTC и форматировать его только тогда, когда оно должно отображаться пользователю. То есть вместо звонка

moment(utcDateTime...

вызов

moment.UTC(utcDateTime...

и результаты будут такими, как ожидалось:

const utcDateTime = "8/28/2018 7:30:00 PM";
const oneDayBefore = moment.utc(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
//                         ^^^^
console.log(oneDayBefore.format());
const now = moment.utc();
console.log(now.format());


console.log(now.isSameOrAfter(oneDayBefore, 'day'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 28 августа 2018

Я думаю, что нашел два способа сделать это, но, пожалуйста, посоветуйте, я немного запутался в параметрах дней, минут и т. Д., Которые можно вставить в метод

var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
var currentUtcMoment = moment().utc().format("M/D/YYYY h:mm:ss A");

if (moment(currentUtcMoment).isSameOrAfter(oneDayBefore, 'day')) {
  // do something
}

или

var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
var currentUtcMoment = moment().utc().format("M/D/YYYY h:mm:ss A");

if (moment().utcOffset((moment().utcOffset() * -1)).isSameOrAfter(oneDayBefore, 'day')) {
  // do something
}
...