Moment JS - проверьте, соответствует ли дата сегодня или в будущем

Я пытаюсь использовать momentjs, чтобы проверить, установлена ​​ли данная дата сегодня или в будущем.

Это то, что у меня есть до сих пор:

<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>

Код оценивает мою дату (31 января 2014 года) в качестве даты в прошлом.

Любая идея, что я делаю неправильно?

Ответ 1

После прочтения документации: http://momentjs.com/docs/#/displaying/difference/, вы должны рассмотреть функцию diff как минус-оператор.

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

Следовательно, вы должны изменить ваше условие.

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

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

Ответ 2

Вы можете использовать функцию isSame:

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

}

Ответ 3

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

Ответ 4

Вы можете использовать функцию запроса isAfter() для momentjs:

Проверьте, есть ли момент спустя другой момент.

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

Если вы хотите ограничить детализацию единицей, отличной от миллисекунд, передайте единицы измерения в качестве второго параметра.

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/

Ответ 5

Поскольку никто, кажется, еще не упомянул об этом, самый простой способ проверить, находится ли объект даты Момента в прошлом:

momentObj.isBefore()

Или в будущем:

momentObj.isAfter()

Просто оставьте аргументы пустыми - это будет по умолчанию сейчас.

Там также isSameOrAfter и isSameOrBefore.

NB это факторы во времени. Если вам небезразличен только день, посмотрите ответ Дипенду.

Ответ 6

invert isBefore метод момента, чтобы проверить, соответствует ли дата такой же, как сегодня или в будущем, как это:

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

Ответ 7

Чтобы проверить, действительно ли это сегодня:

Если мы сравним две даты, которые также содержат информацию о времени isSame, очевидно, не удастся. diff не удастся, если две даты будут отображаться в течение нового дня:

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

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

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

Чтобы проверить, есть ли это в будущем:

Как и другие пользователи, метод diff работает.

var isFuture = now.diff(anotherDate) < 0 

Ответ 8

Если вам нужно только узнать, какой из них больше, вы также можете сравнить их напрямую:

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

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

Ответ 9

если firstDate совпадает или после (в будущем) secondDate return true else возвращает 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;
  }

Существует пример isSame, isBefore и isAfter для примера сравнения дней;

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

Ответ 10

На всякий случай, если это кому-то еще нужно, просто сделайте это:

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

или если вы хотите функцию:

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

Где дата - это дата, которую вы хотите проверить.

объяснение

moment(0, "HH") возвращает сегодняшний день в полночь.

date1.diff(date2, "days") возвращает количество дней между date1 и date2.

Обновить

С тех пор я нашел функцию isSame, которая, на мой взгляд, является правильной функцией для определения даты на сегодняшний день:

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

Ответ 11

Используйте простейший для проверки на будущее.

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

Ответ 12

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

А затем просто используйте его:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

Ответ 13

Выберите вчера, чтобы проверить прошлые дни или нет с помощью moment().subtract(1, "day");

Ссылка: - http://momentjs.com/docs/#/manipulating/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()">

Ответ 14

Я хотел его для чего-то другого, но в итоге нашел трюк, который вы можете попробовать

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

var d = moment();
 var today = moment();
 
 console.log("Usign today 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>

Ответ 15

Если мы хотим разницу без времени, вы можете получить дату разную (только дату без времени), как показано ниже, используя формат момента.

Как, я столкнулся с проблемой с разницей во время выполнения;

moment().diff([YOUR DATE])

Итак, пришло следующее:

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

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

Пожалуйста, не стесняйтесь комментировать, если есть что улучшить.

Спасибо,