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

222

Я пытаюсь использовать, 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 года) как дату в прошлом.

Есть идеи, что я делаю не так?

Latheesan
источник

Ответы:

197

После прочтения документации: 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)
Орельен Тьерио
источник
75
это не сработает, если будет другой день, но разница меньше 24 часов
galki
1
Работаем независимо от разницы во времени менее 24 часов.
Zanderwar
3
Не работает для меня Если день в будущем моменте +1 (). Diff (SpecialTo, 'days') дает мне -0 (отрицательный ноль)
gavroche
2
Сегодня не значит в следующие 24 часа. isSame - хорошее решение.
Каспер Земьянек
1
moment().diff(SpecialToDate)прямо даст разницу в миллисекундах. 'days'не нужен Это будет работать для всех сценариев. SpecialToDate может быть '2018-10-26 00:00:00'для примера.
обратный
312

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

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

}
Серый волк
источник
это совпадает год и месяц тоже?
SuperUberDuper
13
Это должно соответствовать году и месяцу. момент ('2010-01-01'). isSame ('2011-01-01', 'месяц'); // false, другой год года ('2010-01-01'). isSame ('2010-02-01', 'day'); // ложь, другой месяц
Серый Волк
6
Это даже не отвечает на вопрос ОП: «сегодня ИЛИ В БУДУЩЕМ», и что startTime? У объекта Date нет isSameметода ...
Sharcoux
1
@Sharcoux Этот вопрос о моментах, так что это явно моментальный объект.
Натан
157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Акис
источник
85

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

momentObj.isBefore()

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

momentObj.isAfter()

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

Там же isSameOrAfterи isSameOrBefore.

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

mpen
источник
1
Документы объясняют, что это неопределенное поведение, поэтому вам не следует делать это: momentjs.com/docs/#/query/is-before
Dancrumb
13
@Dancrumb Прочти еще раз. «Если ничего не передано в момент # isBefore, по умолчанию будет установлено текущее время». В momentObjмоем примере это пример даты. Документы специально говорят о создании нового экземпляра (текущее время), а затем проверяют, если это в прошлом, в одном утверждении. Я не предлагаю вам делать moment().isBefore()что-то совершенно бессмысленное - зачем вам проверять, есть ли сейчас прошлое (или будущее)?
mpen
83

Вы можете использовать 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/

dbasch
источник
Конструктор, который принимает строку даты, устарел.
Вахид Амири
@VahidAmiri В документах не упоминается об этом. Однако они предлагают использовать конструктор string + format, если мы не используем ISO 8601 . Так что, если кто-то не использует какие-то странные форматы даты, можно использовать только строку.
Johndodo
15

инвертировать isBefore метод момента, чтобы проверить, совпадает ли дата с сегодняшним днем ​​или в будущем, например:

!moment(yourDate).isBefore(moment(), "day");
Дипенду Пол
источник
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
Франсуа Надо
источник
8

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

Если мы сравним две даты, которые также содержат информацию о времени 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 
Emaborsa
источник
7

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

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

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

jsidera
источник
4

если firstDate то же самое или после (в будущем) secondDate возвращает true, иначе возвращает 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;
  }
ethemsulan
источник
3

Используйте самый простой, чтобы проверить на будущее

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

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

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
источник
1

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

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

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

Поскольку я столкнулся с проблемой с разницей, делая;

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's past day
else
   //it's current or future

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

Спасибо,

Раджан Махарджан
источник
3
Пожалуйста, просмотрите раздел Как написать хороший ответ . Ответы только на код не рекомендуется, потому что они не объясняют, как они решают проблему. Вы должны обновить свой ответ, чтобы объяснить, что он делает и как он улучшает многие ответы на этот вопрос .
FluffyKitten
0

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

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>

abhirathore2006
источник
0

проверьте следующее:

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

это возвращается в секундах ..

Если проверит как состояние 2 минут то

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}
Анупам Маурья
источник
0

Самый простой ответ будет:

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

Он проверит значение полуночи и даст точный результат. Это также будет работать, когда разница между двумя датами будет менее 24 часов.

SKR
источник