Porównanie daty i godziny


384

Korzystam z moment.js, aby sformatować datę, tutaj mam dwie wartości dat i chcę osiągnąć określoną funkcję, gdy jedna data jest większa od drugiej. Przeczytałem większość ich dokumentów, ale nie znalazłem funkcji, aby to osiągnąć. Wiem, że tam będzie.

To jest mój kod:

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 {

}

Edytować

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');
}

Porównuję tutaj dwie daty, tj. 2014-03-24T01:15:000 > 2014-03-24T01:14:000Spodziewam się, że pierwsza jest większa niż druga, ale zawsze idzie w stan inny. Nie wiem dlaczego

Odpowiedzi:


540

Wierzę, że szukasz w funkcjach zapytań , isBefore, isSame, i isAfter.

Ale trudno jest dokładnie powiedzieć, co próbujesz. Być może szukasz tylko różnicy między czasem wejściowym a bieżącym? Jeśli tak, należy rozważyć funkcję różnicy , diff. Na przykład:

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

Kilka innych rzeczy:

  • W pierwszym wierszu jest błąd:

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

    To nie zadziała. Myślę, że miałeś na myśli:

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

    Oczywiście możesz równie dobrze:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Używasz: .tz('UTC')niepoprawnie. .tznależy do strefy czasowej . Nie musisz tego używać, chyba że pracujesz z innymi strefami czasowymi, takimi jak America/Los_Angeles.

    Jeśli chcesz przeanalizować wartość jako UTC, użyj:

    moment.utc(theStringToParse)

    Lub jeśli chcesz przeanalizować wartość lokalną i przekonwertować ją na UTC, użyj:

    moment(theStringToParse).utc()

    A może wcale tego nie potrzebujesz. To, że wartość wejściowa jest w UTC, nie oznacza, że ​​musisz pracować w UTC przez całą swoją funkcję.

  • Wydaje się, że otrzymujesz instancję „teraz” moment(new Date()). Zamiast tego możesz po prostu użyć moment().

Zaktualizowano

W oparciu o Twoją edycję myślę, że możesz po prostu to zrobić:

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

Lub, jeśli chcesz upewnić się, że twoje pola są sprawdzone pod kątem poprawności:

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
Dziękujemy za cenne komentarze. Zmodyfikowałem swój kod, aby uwzględnić twoje komentarze, ale nie dostaję prawidłowej różnicy. Czy możesz sprawdzić mój edytowany kod
Dibish

3
Zobacz zaktualizowaną odpowiedź. Obserwuj także liczbę cyfr w polu sekund. Czy jest req.body.timezonecoś innego niż Z? Jeśli tak to co?
Matt Johnson-Pint

Dziękuję bardzo za edytowany kod, prawie do niego dotarłem. W moim przypadku mam ten numer strefy czasowej od strony użytkownika, np. Date_time = 2014-03-25T23: 10 + 5: 30, kiedy używam chwili (data_czas) .utc () jakiś czas otrzymałem niepoprawną datę
Dibish

1
Kiedy dodam +05: 30, działa świetnie. Jeszcze raz bardzo dziękuję za życzliwość
Dibish

.isSame () jest dokładnie tym, czego szukałem. Jakoś tęskniłem wcześniej w dokumentach.
Will Strohl,

231

Powinieneś być w stanie porównać je bezpośrednio.

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

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


87
Wydaje mi się, że warto wyjaśnić, że to działa, ponieważ javascript wymusza obiekty na prymitywach, za pomocą Object.prototype.valueOfktórych jest zastępowany w tym momencie prototypem, aby zwrócić znacznik czasu epoki jako liczbę. To jest podobne do now.format('x') > date.format('x').
tandrewnichols,

nie, to nie działa ... oto co próbowałem. // newDate jest wyższa niż obecna data ... więc drukowanie kończy się niepowodzeniem zarówno w dłuższych, jak i krótszych warunkach const resDate = res.url.expiryDate; const newDate = moment (resDate); var now = moment (). format („DD / MM / RRRR”); if (now <newDate) {console.log („sukces”); } else {console.log („fail”)}
Steve

3
@steve moment().format("DD/MM/YYYY")zwróci ciąg, a następnie porównujesz alfabetycznie, a następnie 1 grudnia nastąpi przed 2 stycznia, ponieważ prowadzisz również z dniami. Nie używaj, format()jeśli chcesz bezpośrednio porównać obiekt objcts.
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"));

Metoda zwraca 1, jeśli dateTimeA jest większe niż dateTimeB

Metoda zwraca 0, jeśli dateTimeA jest równe dateTimeB

Metoda zwraca -1, jeśli dateTimeA jest mniejsze niż dateTimeB


1
funkcja porównaj1 (dateTimeA, dateTimeB) {moment powrotu (dateTimeA, „MM / DD / RRRR”). diff (dateTimeB, „MM / DD / RRRR”); }
Shamseer

23

Ważne jest, aby data i godzina były w odpowiednim formacie ISO podczas korzystania z dowolnego zapytania momentjs :isBefore , isAfter, isSameOrBefore, isSameOrAfter,isBetween

Więc zamiast 2014-03-24T01: 14: 000, twoja data i godzina powinna wynosić:

2014-03-24T01: 14: 00 lub 2014-03-24T01: 14: 00.000Z

w przeciwnym razie może zostać wyświetlone następujące ostrzeżenie o wycofaniu, a warunek zostanie oceniony jako fałszywy:

Ostrzeżenie o rezygnacji: podana wartość nie ma rozpoznanego formatu RFC2822 lub ISO. konstrukcja moment wraca do js Date (), która nie jest niezawodna we wszystkich przeglądarkach i wersjach. Formaty daty inne niż RFC2822 / ISO są odradzane i zostaną usunięte w nadchodzącym wydaniu głównym. Więcej informacji można znaleźć na stronie 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

przekazać datę do chwili w ten sposób, to porówna i da wynik. jeśli nie chcesz formatować, usuń go

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

6
Be carefulto nic innego jak porównanie dwóch strun
Pranoy Sarkar

@PranoySarkar, czy możesz mi powiedzieć, dlaczego musimy być bardziej ostrożni?
DEEPESH KUMAR R


2

do porównania daty i czasu można użyć valueOffunkcji momentu, która zapewnia milisekundy daty i godziny, co jest najlepsze do porównania:

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;
        }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.