Момент js сравнение даты и времени


384

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

Это мой код:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

редактировать

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

Здесь я сравниваю две даты, т. 2014-03-24T01:15:000 > 2014-03-24T01:14:000Е. Ожидаю, что первая больше второй, но она всегда переходит в другое условие. Я не знаю почему?

Ответы:


541

Я считаю , что вы ищете функции запроса , isBefore, isSame, и isAfter.

Но немного сложно точно сказать, что вы пытаетесь. Возможно, вы просто хотите узнать разницу между временем ввода и текущим временем? Если это так, рассмотрим функцию разности , diff. Например:

moment().diff(date_time, 'minutes')

Несколько других вещей:

  • В первой строке есть ошибка:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    Это не сработает. Я думаю, что вы имели в виду:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    Конечно, вы могли бы также:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Вы используете: .tz('UTC')неправильно. .tzпринадлежит моменту-часовому поясу . Вам не нужно использовать это, если вы не работаете с другими часовыми поясами, например America/Los_Angeles.

    Если вы хотите проанализировать значение как UTC, используйте:

    moment.utc(theStringToParse)

    Или, если вы хотите проанализировать локальное значение и преобразовать его в UTC, используйте:

    moment(theStringToParse).utc()

    Или, может быть, вам это вообще не нужно. То, что входное значение указано в UTC, не означает, что вам нужно работать в UTC во всей функции.

  • Вы, кажется, получаете "сейчас" экземпляр moment(new Date()). Вы можете вместо этого просто использовать moment().

обновленный

Основываясь на ваших изменениях, я думаю, вы можете просто сделать это:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

Или, если вы хотите убедиться, что ваши поля проверены в правильном формате:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
Спасибо за ваши ценные комментарии. Я отредактировал свой код, добавив в него ваши комментарии, но не получил правильного понимания. Можете ли вы проверить мой отредактированный код
Dibish

3
Смотрите обновленный ответ. Также следите за количеством цифр в поле секунд. И есть req.body.timezoneли что-нибудь кроме Z? Если так, то?
Мэтт Джонсон-Пинт

Большое спасибо за ваш отредактированный код, я почти достиг его. В моем случае у меня есть номер этого часового пояса со стороны пользователя, например, date_time = 2014-03-25T23: 10 + 5: 30, когда я использую момент (date_time) .utc () когда-то я получил
Неверную

1
Когда я ставлю +05: 30, это прекрасно работает. Еще раз большое спасибо за вашу доброту
Dibish

.isSame () это именно то, что я искал. Как-то пропустил это в документах раньше.
Уилл Штрол

232

Вы должны быть в состоянии сравнить их напрямую.

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


88
Я чувствую, что стоит объяснить, что это работает, потому что javascript приводит объекты к примитивам, через Object.prototype.valueOfкоторые переопределяется в прототипе момента для возврата метки времени эпохи как числа. Так что это похоже наnow.format('x') > date.format('x') .
tandrewnichols

нет, это не работает ... вот что я пытался. // newDate выше, чем текущая дата ... так что печать не удастся как при увеличении, так и при уменьшении условий const resDate = res.url.expiryDate; const newDate = момент (resDate); var now = момент (). формат ("ДД / ММ / ГГГГ"); if (now <newDate) {console.log ("success"); } else {console.log ("fail")}
Стив

3
@steve moment().format("DD/MM/YYYY")вернет строку, а затем вы сравниваете в алфавитном порядке, а затем 1 декабря наступит раньше 2 января, потому что вы также ведете дни. Не используйте, format()если вы хотите сравнить моментальные объекты напрямую.
Райанвинчестер

28

Jsfiddle: http://jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

Метод возвращает 1, если dateTimeA больше dateTimeB

Метод возвращает 0, если dateTimeA равен dateTimeB

Метод возвращает -1, если dateTimeA меньше dateTimeB


1
function compare1 (dateTimeA, dateTimeB) {момент возврата (dateTimeA, «ММ / ДД / ГГГГ»). diff (dateTimeB, «ММ / ДД / ГГГГ»); }
Shamseer

23

Важно , чтобы ваша дата и время в правильном формате ISO при использовании любого из запросов momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Таким образом, вместо 2014-03-24T01: 14: 000, ваша дата и время должны быть либо:

2014-03-24T01: 14: 00 или 2014-03-24T01: 14: 00.000Z

в противном случае вы можете получить следующее предупреждение об устаревании, и условие оценивается как ложное:

Предупреждение об устаревании: предоставленное значение не соответствует распознанному формату RFC2822 или ISO. момент конструирования возвращается к js Date (), который не надежен во всех браузерах и версиях. Не RFC2822 / ISO форматы даты не рекомендуется и будут удалены в следующем основном выпуске. Пожалуйста, обратитесь к http://momentjs.com/guides/#/warnings/js-date/ для получения дополнительной информации.

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

Передайте дату и момент, как это, он будет сравнивать и давать результат. если вы не хотите форматировать, удалите его

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulэто не что иное, как сравнение двух струн
Праной Саркар

@PranoySarkar не могли бы вы сказать мне, почему мы должны быть более осторожными?
DEEPESH KUMAR R


2

для сравнения даты и времени вы можете использовать valueOfфункцию момента, которая обеспечивает миллисекунды даты и времени, которая лучше всего подходит для сравнения:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.