Moment JS - sprawdź, czy data jest dzisiaj, czy w przyszłości


222

Próbuję użyć, momentjsaby sprawdzić, czy dana data jest dzisiaj, czy w przyszłości.

Oto co mam do tej pory:

<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript">

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment().diff(SpecialTo) > 0) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

</script>

Kod ocenia moją datę (31 stycznia 2014 r.) Jako datę z przeszłości.

Masz pojęcie, co robię źle?

Odpowiedzi:


197

Po przeczytaniu dokumentacji: http://momentjs.com/docs/#/displaying/difference/ , musisz rozważyć tę difffunkcję jak operator minus.

                   // today < future (31/01/2014)
today.diff(future) // today - future < 0
future.diff(today) // future - today > 0

Dlatego musisz odwrócić swój stan.

Jeśli chcesz sprawdzić, czy wszystko jest w porządku, możesz dodać dodatkowy parametr do funkcji:

moment().diff(SpecialTo, 'days') // -8 (days)

75
to nie zadziała, jeśli jest inny dzień, ale różnica jest mniejsza niż 24 godziny
galki

1
Działa, niezależnie od tego, czy różnica czasu jest mniejsza niż 24 godziny.
zanderwar

3
Nie działa dla mnie. Jeśli dzień jest +1 w przyszłej chwili (). Diff (SpecialTo, 'dni') daje mi -0 (zero ujemne)
gavroche

2
Dzisiejszy dzień nie oznacza za 24 godziny. isSame to dobre rozwiązanie.
Kasper Ziemianek

1
moment().diff(SpecialToDate)poda różnicę w milisekundach. 'days'nie jest potrzebne. Będzie to działać we wszystkich scenariuszach. Przykładem może być SpecialToDate '2018-10-26 00:00:00'.
backslashN

312

Możesz użyć isSamefunkcji:

var iscurrentDate = startTime.isSame(new Date(), "day");
if(iscurrentDate) {

}

czy ten mecz też ma rok i miesiąc?
SuperUberDuper,

13
Musi pasować do roku i miesiąca. moment („2010-01-01”). isSame („2011-01-01”, „miesiąc”); // false, inny moment w roku („2010-01-01”). isSame („2010-02-01”, „dzień”); // false, inny miesiąc
Gray Wolf

6
To nawet nie odpowiada na pytanie PO ... „dzisiaj LUB W PRZYSZŁOŚCI” i co to jest startTime? Obiekt daty nie ma isSamemetody ...
Sharcoux,

1
@Sharcoux To pytanie dotyczy momentjs, więc wyraźnie jest to obiekt chwili.
Nathan

157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

85

Ponieważ wydaje się, że nikt jeszcze o tym nie wspominał, najprostszym sposobem sprawdzenia, czy obiekt daty Moment jest w przeszłości:

momentObj.isBefore()

Lub w przyszłości:

momentObj.isAfter()

Po prostu zostaw argumenty puste - domyślnie będzie to teraz.

Jest też isSameOrAfteri isSameOrBefore.

NB to czynniki w czasie. Jeśli zależy ci tylko na dniu, zobacz odpowiedź Dipendu .


1
Dokumenty wyjaśniają, że jest to niezdefiniowane zachowanie, więc nie powinieneś tego robić: momentjs.com/docs/#/query/is-before
Dancrumb

13
@Dancrumb Przeczytaj ponownie. „Jeśli nic nie zostanie przekazane do momentu # isBefore, nastąpi domyślny czas bieżący.” W momentObjmoim przykładzie jest to przypadek daty chwili. Dokumenty mówią konkretnie o utworzeniu nowego wystąpienia (bieżący czas), a następnie sprawdzeniu, czy było to w przeszłości, w jednym oświadczeniu. Ja nie sugeruję zrobić moment().isBefore()co jest kompletnie bez sensu - dlaczego chcesz sprawdzić, czy teraz jest w przeszłości (lub przyszłości)?
mpen

83

Możesz użyć isAfter()funkcji zapytania momentjs:

Sprawdź, czy chwila jest po innej chwili.

moment('2010-10-20').isAfter('2010-10-19'); // true

Jeśli chcesz ograniczyć ziarnistość do jednostki innej niż milisekundy, podaj jednostki jako drugi parametr.

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false

moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

http://momentjs.com/docs/#/query/is-after/


Konstruktor, który pobiera ciąg daty, jest przestarzały.
Vahid Amiri,

@VahidAmiri W docs nie wspomnieć o tym. Sugerują jednak, że używamy konstruktora napisów + formatu, jeśli nie używamy ISO 8601 . Jeśli więc nie używasz dziwnych formatów dat, możesz użyć tylko ciągu znaków.
johndodo

15

Odwróć jest przed chwilą metodą moment, aby sprawdzić, czy data jest taka sama jak dzisiaj lub w przyszłości, tak jak to:

!moment(yourDate).isBefore(moment(), "day");

10

Na wypadek, gdyby ktoś inny tego potrzebował, po prostu zrób to:

const isToday = moment(0, "HH").diff(date, "days") == 0;

lub jeśli chcesz funkcji:

isToday = date => moment(0,"HH").diff(date, "days") == 0;

Gdzie data jest datą, którą chcesz sprawdzić.

Wyjaśnienie

moment(0, "HH") wraca dzisiaj o północy.

date1.diff(date2, "days") zwraca liczbę dni między datą 1 a datą 2.

Aktualizacja

Od tamtej pory znalazłem funkcję isSame , która moim zdaniem jest właściwą funkcją do sprawdzenia, czy data jest dzisiaj:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01

8

Aby sprawdzić, czy jest dzisiaj :

Jeśli porównamy dwie daty, które zawierają również informacje o czasie isSame, oczywiście się nie powiedzie. diffzawiedzie w przypadku, gdy dwie daty obejmują nowy dzień:

var date1 = moment("01.01.2016 23:59:00", "DD.MM.YYYY HH.mm.ss");
var date2 = moment("02.01.2016 00:01:00", "DD.MM.YYYY HH.mm.ss");
var diff = date2.diff(date1); // 2seconds

Myślę, że najlepszym sposobem, nawet jeśli nie jest szybki i krótki, jest:

var isSame = date1.date() == date2.date() && date1.month() == date2.month() && date1.year() == date2.year()

Aby sprawdzić, czy będzie w przyszłości :

Jak sugerują także inni użytkownicy, diffmetoda działa.

var isFuture = now.diff(anotherDate) < 0 

7

Jeśli potrzebujesz tylko wiedzieć, który z nich jest większy, możesz również porównać je bezpośrednio:

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment() > SpecialTo) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

Mam nadzieję że to pomoże!


4

jeśli firstDate jest taki sam lub po (przyszłym) secondDate zwraca true , w przeciwnym razie zwraca false Toda is firstDate = new Date ();

  static isFirstDateSameOrAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isSameOrBefore(date2,'day');
    }
    return false;
  }

Istnieje isSame, isBefore i isAfter na dzień porównaj przykład;

  static isFirstDateSameSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if (date1 && date2) {
      return date1.isSame(date2,'day');
    }
    return false;
  }

  static isFirstDateAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isAfter(date2,'day');
    }
    return false;
  }

  static isFirstDateBeforeSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isBefore(date2,'day');
    }
    return false;
  }

3

Użyj najprostszego, aby sprawdzić przyszłą datę

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");

2
function isTodayOrFuture(date){
  date = stripTime(date);
  return date.diff(stripTime(moment.now())) >= 0;
}

function stripTime(date){
  date = moment(date);
  date.hours(0);
  date.minutes(0);
  date.seconds(0);
  date.milliseconds(0);
  return date;
}

A następnie użyj tego wiersza:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

Wybierz wczoraj, aby sprawdzić poprzednie dni lub nie przy pomocy moment().subtract(1, "day");

Odniesienie: - http://momentjs.com/docs/#/manipicing/subtract/

function myFunction() {
  var yesterday = moment().subtract(1, "day").format("YYYY-MM-DD");
  var SpecialToDate = document.getElementById("theDate").value;

  if (moment(SpecialToDate, "YYYY-MM-DD", true).isAfter(yesterday)) {
    alert("date is today or in future");
    console.log("date is today or in future");
  } else {
    alert("date is in the past");
    console.log("date is in the past");
  }
}
<script src="http://momentjs.com/downloads/moment.js"></script>
<input type="date" id="theDate" onchange="myFunction()">


1

Jeśli chcemy różnicy bez czasu, możesz ustawić inną datę (tylko datę bez godziny), jak poniżej, używając formatu momentu.

Ponieważ podczas tej pracy miałem do czynienia z różnicą;

moment().diff([YOUR DATE])

Więc wymyślił następujące;

const dateValidate = moment(moment().format('YYYY-MM-DD')).diff(moment([YOUR SELECTED DATE HERE]).format('YYYY-MM-DD'))

IF dateValidate > 0 
   //it's past day
else
   //it's current or future

Prosimy o komentarz, jeśli jest coś, co można poprawić.

Dzięki,


3
Przeczytaj, jak napisać dobrą odpowiedź . Odpowiedzi zawierające tylko kod są odradzane, ponieważ nie wyjaśniają, w jaki sposób rozwiązują problem. Powinieneś zaktualizować swoją odpowiedź, aby wyjaśnić, co to robi i jak poprawia się w przypadku wielu odpowiedzi na to pytanie .
FluffyKitten

0

Chciałem tego dla czegoś innego, ale w końcu znalazłem sztuczkę, którą możesz wypróbować

somedate.calendar(compareDate, { sameDay: '[Today]'})=='Today'

var d = moment();
 var today = moment();
 
 console.log("Usign today's date, is Date is Today? ",d.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
 var someRondomDate = moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Usign Some Random Date, is Today ?",someRondomDate.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
  
 var anotherRandomDate =  moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Two Random Date are same date ? ",someRondomDate.calendar(anotherRandomDate, {
    sameDay: '[Today]'})=='Today');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


0

sprawdź za pomocą:

let isContinue = moment().diff('2020-04-04T20:06:11+05:30')/1000

wraca w kilka sekund ..

Jeśli sprawdzi jako warunek 2 minuty, to

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}

0

Najprostsza odpowiedź to:

const firstDate = moment('2020/10/14'); // the date to be checked
const secondDate = moment('2020/10/15'); // the date to be checked

firstDate.startOf('day').diff(secondDate.startOf('day'), 'days'); // result = -1
secondDate.startOf('day').diff(firstDate.startOf('day'), 'days'); // result = 1

Sprawdzi wartość północy i zwróci dokładny wynik. Działa również, gdy różnica czasu między dwiema datami jest mniejsza niż 24 godziny.

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.