Момент 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очікую, що перша з них більша за другу, але вона завжди переходить до іншої умови. Я не знаю, чому?

Відповіді:


540

Я вважаю , що ви шукаєте телефон запитувати його , 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? Якщо так, то що?
Метт Джонсон-Пінт

Дякую вам за ваш відредагований код, я майже дістався туди. У моєму випадку у мене є номер часового поясу з боку користувача, наприклад, дата_time = 2014-03-25T23: 10 + 5: 30, коли я використовую момент (date_time) .utc () деякий час я отримав недійсну дату
Dibish

1
Коли я ставлю +05: 30, це чудово працює. Ще раз дякую вам за вашу доброту
Дібіш,

.isSame () - саме те, що я шукав. Якось пропускав це в документах раніше.
Буде Строль

231

Ви повинні мати можливість безпосередньо їх порівняти.

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

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


87
Мені здається, що варто пояснити, що це працює, тому що javascript примушує об'єкти до примітивів, через Object.prototype.valueOfякі в прототипі моменту це переосмислюється, щоб повернути часову позначку епохи як число. Так це схоже на now.format('x') > date.format('x').
tandrewnichols

ні його не працює ... ось що я спробував. // newDate вище, ніж теперішня дата ... тому він видає помилки як у більших, так і в менших умовах const resDate = res.url.expiryDate; const newDate = момент (resDate); var now = moment (). формат ("DD / MM / YYYY"); if (зараз <newDate) {console.log ("успіх"); } else {console.log ("провалити")}
steve

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

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
функція порівняння1 (dateTimeA, dateTimeB) {момент повернення (dateTimeA, 'MM / DD / YYYY'). diff (dateTimeB, 'MM / DD / YYYY'); }
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, скажіть, будь ласка, чому ми повинні бути обережнішими?
ГЛИБОК КУМАР 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.