Moment.js isBefore () не работает при проверке, если до 12 часов вечера - PullRequest
0 голосов
/ 30 августа 2018

Я использую Moment.js для обработки некоторой маркировки даты на внешнем интерфейсе. Я столкнулся с неясным сценарием и хотел бы, чтобы эксперты MomentJS исправили меня, пожалуйста.

Рассмотрим следующую реализацию с переданным строковым значением, "2018-08-28T20:21:56"

Обратите внимание, что вышеупомянутая строка даты и добавленная минута 600 предоставляются динамически из серверной части.

let dateTitle;

// Before setting date label, compare enddate with endoffset against 12pm
let endCutOff = moment("2018-08-28T20:21:56").add(600, 'm');
let isBeforeNoon = moment(endCutOff).isBefore(moment({ hour: 12, minute: 0 }));

if ( isBeforeNoon ) {
    // Credit previous day if user ended before noon.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .subtract(1, 'd')
    .format('MMMM D, YYYY');
} else {
    // Credit that very day if after 12pm.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .format('MMMM D, YYYY');
}

Правильно выводится как "28 августа 2018 года"

Однако, повторите ту же операцию с переданным строковым значением, "2018-08-29T20:43:58", и вы увидите, что это выдает "30 августа 2018" .

Это должно быть "29 августа 2018 года" .

Я признаю очевидное в том, что isBeforeNoon верно в первом раунде и ложно в следующем. Но объяснение того, почему и как это исправить, - это то место, где мне нужен ваш опыт. Я подозреваю, что это связано с передаваемым форматом строки даты, но пока это просто понятие.

Спасибо за вашу помощь.

1 Ответ

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

Если я правильно понимаю ситуацию, проблема вызвана тем, что компонент даты moment({ hour: 12, minute: 0 }) по умолчанию равен "сегодняшняя календарная дата".

По умолчанию .isBefore() учитывает как время , так и дату сравниваемых моментов.

Следовательно, это означает, что isBeforeNoon определяется датой endCutOff и текущей календарной датой (которая, очевидно, всегда меняется).

Возможно, вы могли бы сделать следующее:

let endCutOff = moment("2018-08-28T20:21:56").add(600, 'm');

// Create a copy of endCutOff to aquire the date from endCutOff, and set
// hour/minute accordingly
let momentForIsBefore = endCutOff.clone().hour(12).minute(0).second(0); 
let isBeforeNoon = moment(endCutOff).isBefore(momentForIsBefore);

if ( isBeforeNoon ) {
    // Credit previous day if user ended before noon.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .subtract(1, 'd')
    .format('MMMM D, YYYY');
} else {
    // Credit that very day if after 12pm.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .format('MMMM D, YYYY');
}

Надеюсь, это поможет!

...