Момент 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 року) як дату в минулому.

Будь-яка ідея, що я роблю неправильно?

Відповіді:


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 годин
галкі

1
Працюючи, незалежно від того, чи різниця у часі менше 24 годин.
zanderwar

3
Не працює для мене. Якщо день +1 у майбутньому моменті (). Розл. (SpecialTo, 'дні') дає мені -0 (від’ємний нуль)
gavroche

2
Сьогодні це не означає протягом наступних 24 годин. isSame - це гарне рішення.
Kasper Ziemianek

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', 'місяць'); // хибний, різний момент року ('2010-01-01'). isSame ('2010-02-01', 'день'); // хибний, інший місяць
Сірий Вовк

6
Це навіть не відповідає на питання ОП ... "сьогодні чи в майбутньому", і що це startTime? Об'єкт дати не має isSameметоду ...
Шарку

1
@Sharcoux Це питання стосується momentjs, тому явно це момент моменту.
Натан

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 .

Зверніть увагу на ці фактори в часі. Якщо ви дбаєте лише про день, дивіться відповідь Діпенду .


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/


Конструктор, який приймає рядок дати, застарілий.
Вахід Амірі

@VahidAmiri Документи не згадують про це. Однак вони пропонують використовувати конструктор формату string +, якщо ми не використовуємо ISO 8601 . Тому, якщо ви не використовуєте якісь дивні формати дати, добре використовувати лише рядок.
johndodo

15

invert isПеред методом моменту, щоб перевірити, чи дата така, як сьогодні або в майбутньому, подібна до цієї:

!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") повертає кількість днів між датою1 та датою2.

Оновлення

З того часу я знайшов функцію 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 

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

Сподіваюсь, це допомагає!


4

якщо firstDate такий самий або після (майбутній) returnDact повернення істинне, інше повертається помилковим. Toda є firstDate = нова дата ();

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

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)

1

Виберіть вчора, щоб перевірити минулі дні чи ні за допомогою 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()">


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>


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 годин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.