Momen JS - periksa apakah suatu kencan hari ini atau di masa depan

222

Saya mencoba menggunakan momentjsuntuk memeriksa apakah tanggal yang diberikan adalah hari ini atau di masa depan.

Inilah yang saya miliki sejauh ini:

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

Kode mengevaluasi tanggal saya (31 Januari 2014) sebagai tanggal di masa lalu.

Adakah yang saya tahu salah?

Bubut
sumber

Jawaban:

197

Setelah membaca dokumentasi: http://momentjs.com/docs/#/displaying/difference/ , Anda harus mempertimbangkan difffungsi seperti operator minus.

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

Karena itu, Anda harus membalik kondisi Anda.

Jika Anda ingin memeriksa apakah semuanya baik-baik saja, Anda dapat menambahkan parameter tambahan ke fungsi:

moment().diff(SpecialTo, 'days') // -8 (days)
Aurélien Thieriot
sumber
75
ini tidak akan berhasil jika ini adalah hari yang berbeda tetapi perbedaannya kurang dari 24 jam
galki
1
Bekerja, terlepas dari apakah perbedaan waktu kurang dari 24 jam.
zanderwar
3
Tidak bekerja untukku. Jika hari +1 di saat mendatang (). Diff (SpecialTo, 'days') memberi saya -0 (negatif nol)
gavroche
2
Hari ini tidak berarti dalam 24 jam ke depan. isSame adalah solusi yang baik.
Kasper Ziemianek
1
moment().diff(SpecialToDate)akan langsung memberikan perbedaan dalam milidetik. 'days'tidak dibutuhkan. Ini akan berfungsi untuk semua skenario. SpecialToDate bisa '2018-10-26 00:00:00'sebagai contoh.
backslashN
312

Anda dapat menggunakan isSamefungsi ini:

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

}
Serigala abu-abu
sumber
apakah ini cocok tahun dan bulan juga?
SuperUberDuper
13
Itu harus cocok tahun dan bulan. moment ('2010-01-01'). isSame ('2011-01-01', 'month'); // false, momen tahun yang berbeda ('2010-01-01'). isSame ('2010-02-01', 'day'); // salah, bulan berbeda
Gray Wolf
6
Ini bahkan tidak menjawab pertanyaan OP ... "hari ini ATAU DI MASA DEPAN", dan apa itu startTime? Objek kencan tidak memiliki isSamemetode ...
Sharcoux
1
@ Sharcoux Pertanyaan ini adalah tentang momentjs, jadi jelas itu adalah objek momen.
Nathan
157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Akis
sumber
85

Karena belum ada yang menyebutkannya, cara paling sederhana untuk memeriksa apakah objek tanggal Momen ada di masa lalu:

momentObj.isBefore()

Atau di masa depan:

momentObj.isAfter()

Biarkan args kosong - itu akan menjadi default sekarang.

Ada juga isSameOrAfterdan isSameOrBefore.

NB faktor-faktor ini dalam waktu. Jika Anda hanya peduli hari itu, lihat jawaban Dipendu .

Mpen
sumber
1
Dokumen menjelaskan bahwa ini adalah perilaku yang tidak terdefinisi, jadi Anda tidak boleh melakukan ini: momentjs.com/docs/#/query/is-before
Dancrumb
13
@ Dancrumb Baca lagi. "Jika tidak ada yang diteruskan ke saat # sebelumnya. Sebelum, itu akan default ke waktu sekarang." Dalam momentObjcontoh saya adalah contoh dari tanggal saat. Dokumen secara khusus berbicara tentang membuat contoh baru (waktu sekarang) dan kemudian memeriksa apakah itu di masa lalu, dalam satu pernyataan. Saya tidak menyarankan Anda melakukan moment().isBefore()yang sama sekali tidak ada gunanya - mengapa Anda memeriksa apakah sekarang di masa lalu (atau masa depan)?
mpen
83

Anda dapat menggunakan isAfter()fungsi kueri momentjs:

Periksa apakah ada momen setelah momen lain.

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

Jika Anda ingin membatasi granularity ke unit selain milidetik, berikan unit sebagai parameter kedua.

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
sumber
Konstruktor yang mengambil string tanggal sudah tidak digunakan lagi.
Vahid Amiri
@VahidAmiri Dokumen tidak menyebutkan ini. Namun mereka menyarankan kita menggunakan konstruktor string + format jika kita tidak menggunakan ISO 8601 . Jadi, kecuali seseorang menggunakan beberapa format tanggal yang aneh, boleh saja menggunakan string saja.
johndodo
15

invert isBefore metode saat untuk memeriksa apakah tanggal sama dengan hari ini atau di masa depan seperti ini:

!moment(yourDate).isBefore(moment(), "day");
Dipendu Paul
sumber
10

Kalau-kalau ada orang lain yang membutuhkan ini, lakukan saja ini:

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

atau jika Anda menginginkan suatu fungsi:

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

Di mana tanggal adalah tanggal yang ingin Anda periksa.

Penjelasan

moment(0, "HH") mengembalikan hari ini pada tengah malam.

date1.diff(date2, "days") mengembalikan jumlah hari antara date1 dan date2.

Memperbarui

Sejak itu saya telah menemukan fungsi isSame , yang menurut saya adalah fungsi yang benar untuk digunakan untuk mencari tahu jika kencan hari ini:

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

Untuk memeriksa apakah hari ini :

Jika kita membandingkan dua tanggal yang berisi juga informasi waktu isSamejelas akan gagal. diffakan gagal jika dua tanggal span selama hari yang baru:

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

Saya pikir cara terbaik, meskipun tidak cepat dan pendek, adalah sebagai berikut:

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

Untuk memeriksa apakah di masa mendatang :

Seperti yang disarankan juga oleh pengguna lain, diffmetode ini berfungsi.

var isFuture = now.diff(anotherDate) < 0 
Emaborsa
sumber
7

Jika Anda hanya perlu tahu mana yang lebih besar, Anda juga dapat membandingkannya secara langsung:

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

Semoga ini membantu!

jsidera
sumber
4

jika firstDate sama atau setelah (masa depan) secondDate mengembalikan true else mengembalikan false. Toda adalah firstDate = Tanggal baru ();

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

Ada isSame, isBefore dan isAfter untuk hari membandingkan contoh saat;

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

Gunakan yang paling sederhana untuk memeriksa tanggal di masa depan

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");
Ali Adravi
sumber
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;
}

Dan kemudian gunakan saja baris ini:

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
sumber
1

Pilih kemarin untuk memeriksa hari terakhir atau tidak dengan bantuan moment().subtract(1, "day");

Referensi: - 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()">

Mo.
sumber
1

Jika kami menginginkan perbedaan tanpa waktu Anda dapat memperoleh tanggal yang berbeda (hanya tanggal tanpa waktu) seperti di bawah ini, menggunakan format momen.

Seperti, saya menghadapi masalah dengan perbedaan saat melakukan;

moment().diff([YOUR DATE])

Jadi, muncul dengan mengikuti;

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

Silakan berkomentar jika ada yang perlu diperbaiki.

Terima kasih,

Rajan Maharjan
sumber
3
Tinjau Bagaimana menulis jawaban yang baik . Jawaban khusus kode tidak disarankan karena tidak menjelaskan bagaimana mereka menyelesaikan masalah. Anda harus memperbarui jawaban Anda untuk menjelaskan apa yang dilakukannya dan bagaimana meningkatkannya pada banyak jawaban yang sudah dimiliki pertanyaan ini .
FluffyKitten
0

Saya menginginkannya untuk hal lain tetapi akhirnya menemukan trik yang dapat Anda coba

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

periksa dengan berikut:

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

itu kembali dalam hitungan detik ..

Jika akan memeriksa kondisi 2 menit maka

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

Jawaban paling sederhana adalah:

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

Ini akan memeriksa dengan nilai tengah malam dan akan mengembalikan hasil yang akurat. Ini akan bekerja juga ketika perbedaan waktu antara dua tanggal juga kurang dari 24 jam.

SKR
sumber