Membandingkan bagian tanggal saja tanpa membandingkan waktu dalam JavaScript

397

Apa yang salah dengan kode di bawah ini?

Mungkin akan lebih mudah untuk hanya membandingkan tanggal dan bukan waktu. Saya juga tidak yakin bagaimana melakukan ini, dan saya mencari, tetapi saya tidak dapat menemukan masalah saya yang sebenarnya.

BTW, ketika saya menampilkan dua tanggal dalam suatu peringatan, mereka menunjukkan persis sama.

Kode saya:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Apakah ada cara yang lebih sederhana untuk membandingkan tanggal dan tidak termasuk waktu?

molekul
sumber

Jawaban:

781

Saya masih belajar JavaScript, dan satu-satunya cara yang saya temukan yang berfungsi untuk membandingkan dua tanggal tanpa waktu adalah dengan menggunakan setHoursmetode objek Date dan menetapkan jam, menit, detik, dan milidetik menjadi nol. Kemudian bandingkan kedua tanggal tersebut.

Sebagai contoh,

date1 = new Date()
date2 = new Date(2011,8,20)

date2akan ditetapkan dengan jam, menit, detik, dan milidetik ke nol, tetapi date1 akan mengaturnya ke waktu saat date1 dibuat. Untuk menghilangkan jam, menit, detik, dan milidetik pada tanggal1 lakukan hal berikut:

date1.setHours(0,0,0,0)

Sekarang Anda dapat membandingkan kedua tanggal sebagai DATES saja tanpa khawatir tentang elemen waktu.

nexar
sumber
63
Perlu diketahui bahwa pengujian oleh date1 === date2tampaknya tidak memberikan perilaku yang konsisten; lebih baik dilakukan date1.valueOf() === b.valueOf()atau bahkan date1.getTime() === date2.getTime(). Keanehan.
Erwin Wessels
4
Hati-hati: jika date1 dan date2 di musim dingin dan musim panas, dan Anda berencana untuk beralih dari satu ke yang lain dengan addDays (1), masalahnya adalah mereka tidak akan memiliki zona waktu yang sama karena penghematan waktu siang hari, jadi yang terakhir bandingkan yang seharusnya memberikan tanggal yang sama tidak akan berfungsi karena kedua tanggal tersebut tidak benar-benar pada jam 00:00: 00: 0.
Oliver
9
Saya tahu ini adalah pertanyaan lama, tetapi muncul terlebih dahulu di google saat mencari. Hati-hati dengan jawaban ini. Ini akan memberikan jawaban yang salah jika pengguna tidak berada di zona waktu yang sama dengan pencipta objek tanggal. Misalnya, ubah zona waktu pada OS komputer Anda ke waktu East Coast (AS). Buka konsol peramban Anda dan ketik var date2 = new Date(2011,8,20). Sekarang ubah zona waktu OS ke Waktu Pasifik (AS). Dalam jenis konsol browser yang sama date2.toDateString()dan Anda akan kembali Mon Sep 19 2011daripada Selasa tanggal 20!
Adam
9
Perhatikan juga bahwa setHours()mengatur waktu berdasarkan zona waktu saat ini, yang secara otomatis terdeteksi oleh browser. Coba: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());akan mencetak "2016-02-28T15:00:00.000Z", tanggal 28, tetapi tidak 29 Zona waktu saya saat ini adalahAsia/Tokyo
transang
8
Jawaban ini benar-benar harus diperbarui untuk menggunakan setUTCxxxmetode, bukan varian lokal / sadar zona waktu.
Stijn de Witt
136

HATI-HATI WAKTU

Menggunakan objek tanggal untuk mewakili hanya-kencan langsung membuat Anda menjadi masalah presisi berlebih besar. Anda perlu mengatur waktu dan zona waktu untuk mencegahnya, dan mereka dapat menyelinap masuk kembali pada langkah apa pun. Jawaban yang diterima untuk pertanyaan ini jatuh ke dalam jebakan.

Tanggal javascript tidak memiliki gagasan tentang zona waktu . Ini adalah momen waktu (kutu sejak zamannya) dengan fungsi praktis (statis) untuk menerjemahkan ke dan dari string, menggunakan secara default zona waktu "lokal" pada perangkat, atau, jika ditentukan, UTC atau zona waktu lainnya. Untuk mewakili just-a-date ™ dengan objek tanggal, Anda ingin tanggal Anda mewakili UTC tengah malam pada awal tanggal tersebut. Ini adalah konvensi umum dan perlu yang memungkinkan Anda bekerja dengan tanggal terlepas dari musim atau zona waktu pembuatannya. Jadi, Anda harus sangat waspada untuk mengelola gagasan tentang zona waktu, baik saat Anda membuat objek Date UTC tengah malam Anda, dan ketika Anda membuat cerita bersambung.

Banyak orang bingung dengan perilaku default konsol. Jika Anda menyemprotkan tanggal ke konsol, output yang Anda lihat akan mencakup zona waktu Anda. Ini hanya karena konsol memanggil toString()tanggal Anda, dan toString()memberi Anda representasi lokal. Tanggal yang mendasarinya tidak memiliki zona waktu ! (Selama waktu cocok dengan offset zona waktu, Anda masih memiliki objek tanggal UTC tengah malam)

Deserializing (atau membuat objek Date UTC tengah malam)

Ini adalah langkah pembulatan, dengan trik bahwa ada dua jawaban "benar". Sebagian besar waktu, Anda ingin agar tanggal mencerminkan zona waktu pengguna. Klik jika hari ini adalah hari ulang tahun Anda . Pengguna di NZ dan AS mengklik pada waktu yang sama dan mendapatkan tanggal yang berbeda. Dalam hal ini, lakukan ini ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Terkadang, perbandingan internasional mengalahkan akurasi lokal. Dalam hal ini, lakukan ini ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Deserialize tanggal

Seringkali tanggal pada kawat akan berada dalam format YYYY-MM-DD. Untuk menghilangkan bakteri mereka, lakukan ini ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Serialisasi

Setelah berhati-hati mengelola zona waktu saat Anda membuat, Anda sekarang harus memastikan untuk tidak menggunakan zona waktu saat Anda mengonversi kembali ke representasi string. Jadi Anda bisa menggunakan ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Dan benar-benar menghindari yang lainnya, terutama ...

  • getYear(), getMonth(),getDate()

Jadi untuk menjawab pertanyaan Anda, 7 tahun terlambat ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Lihat sedang berjalan ...

Perbarui 2019 ... barang gratis ...

Mengingat popularitas jawaban ini, saya telah memasukkan semuanya ke dalam kode. Fungsi berikut mengembalikan objek tanggal yang dibungkus, dan hanya memaparkan fungsi-fungsi yang aman digunakan dengan just-a-date ™.

Sebut dengan objek Tanggal dan itu akan memutuskan untuk JustADate yang mencerminkan zona waktu pengguna. Sebut dengan string: jika string adalah ISO 8601 dengan zona waktu yang ditentukan, kami hanya akan mengakhiri bagian waktu. Jika zona waktu tidak ditentukan, kami akan mengonversinya menjadi tanggal yang mencerminkan zona waktu lokal, seperti halnya untuk objek tanggal.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())

bbsimonbb
sumber
3
Jawaban Anda mengandung info yang sangat berharga! Sayangnya, Anda tidak benar-benar menambahkan jawaban untuk pertanyaan aktual OP, mencegah saya membatalkannya. Coba tambahkan potongan kode kecil yang menjawab pertanyaan OP.
Stijn de Witt
Ha ha ha @ '7 tahun terlambat'! Saya suka gaya pengguna Anda1585345! Anda mendapat suara saya!
Stijn de Witt
Saya menemukan ini sangat membantu. Perhatikan ada kesalahan ketik dalam cuplikan "perbandingan internasional". Saya pikir seharusnya: Date baru (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak
1
Saya berharap saya dapat mengubah jawaban ini 100 kali !!!
Sнаđошƒаӽ
77

Bagaimana dengan ini?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Ini memungkinkan Anda untuk membandingkan bagian tanggal pada tanggal seperti ini tanpa mempengaruhi nilai variabel Anda:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
Mahir
sumber
Sejauh ini, ini adalah jawaban paling elegan untuk posting asli. Saya tidak membuat fungsi terpisah untuk keperluan saya, hanya menyertakan dua baris kode.
Danimal Reks
25

Menggunakan Moment.js

Jika Anda memiliki opsi untuk menyertakan perpustakaan pihak ketiga, itu pasti layak untuk dilihat di Moment.js . Itu membuat bekerja dengan Datedan DateTimelebih mudah.

Misalnya, melihat jika satu Tanggal datang setelah Tanggal lainnya tetapi tidak termasuk waktu mereka, Anda akan melakukan sesuatu seperti ini:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Parameter kedua Anda masuk ke isAfteradalah presisi untuk melakukan perbandingan dan dapat salah satu dari year, month, week, day, hour, minuteatau second.

Joshua Pinter
sumber
4
mendapat speedup 100x bergerak dari solusi momentjs ke Date () + solusi sethours. teman-teman yang hati-hati :-)
2c2c
@ 2c2c Menarik. Pasti bagus untuk mengetahui dampak kinerja. Berapa banyak operasi yang Anda gunakan untuk benchmark Anda?
Joshua Pinter
1
saya berada di sekitar perbandingan 1mil. tidak menyiapkan patokan yang sebenarnya
2c2c
17

Cukup bandingkan menggunakan .toDateString seperti di bawah ini:

new Date().toDateString();

Ini akan mengembalikan Anda hanya bagian tanggal dan bukan waktu atau zona waktu, seperti ini:

"Jumat 03 Feb 2017"

Karenanya kedua tanggal dapat dibandingkan dalam format ini juga tanpa bagian waktu.

Rahi
sumber
2
Itu awal yang baik, tetapi itu tidak akan memungkinkan untuk perbandingan karena sekarang menjadi string. Untuk membandingkan, ubah kembali menjadi objek Date dengan melakukan new Date(new Date().toDateString());
Grid Trekkor
@ GridTrekkor Benar, tetapi jika Anda hanya ingin tes kesetaraan cepat ini adalah solusi paling sederhana.
CM
8

Ini mungkin versi yang sedikit lebih bersih, juga perhatikan bahwa Anda harus selalu menggunakan radix saat menggunakan parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

Periksa halaman parseInt MDC untuk informasi lebih lanjut tentang radix.

JSLint adalah alat yang hebat untuk menangkap hal-hal seperti radix yang hilang dan banyak hal lain yang dapat menyebabkan kesalahan yang tidak jelas dan sulit di-debug. Ini memaksa Anda untuk menggunakan standar pengkodean yang lebih baik sehingga Anda terhindar dari sakit kepala di masa depan. Saya menggunakannya pada setiap kode proyek JavaScript saya.

Kode tidak berguna
sumber
@EmKay Ini seharusnya tidak menjadi masalah besar sekarang karena ES5 cukup standar di sebagian besar browser dan melarang interpretasi oktaf TETAPI beberapa browser mungkin masih menggunakan interpretasi oktal lama untuk alasan kompatibilitas ke belakang, jadi saya akan tetap menggunakan radix untuk masa mendatang.
Kode Tidak Berguna
Jika Anda menggunakan mode ketat, interpretasi oktal akan melempar kesalahan, yang merupakan hal yang baik karena membantu Anda menemukan kesalahan yang mungkin disalahartikan.
Kode Tidak Berguna
4

The date.js perpustakaan berguna untuk hal-hal ini. Itu membuat semua skrip terkait tanggal JS jauh lebih mudah.

Diodeus - James MacFarlane
sumber
11
Bisakah Anda menambahkan informasi lebih lanjut tentang bagaimana perpustakaan ini mempermudah ini?
Mahmoud Hanafy
4

Jika Anda benar-benar membandingkan tanggal hanya tanpa komponen waktu, solusi lain yang mungkin terasa salah tetapi berfungsi dan menghindari semua Date()sakit kepala waktu dan zona waktu adalah membandingkan tanggal string ISO secara langsung menggunakan perbandingan string:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Anda bisa mendapatkan tanggal saat ini (tanggal UTC, tidak perlu tanggal lokal pengguna) menggunakan:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Argumen saya yang mendukungnya adalah kesederhanaan programmer - Anda jauh lebih kecil kemungkinannya merusak ini daripada mencoba menangani data dan offset dengan benar, mungkin dengan biaya kecepatan (saya belum membandingkan kinerja)

brittohalloran
sumber
Anda juga bisa melakukannya new Date().toISOString().substr(0, 10) // "2019-04-22".
stomy
Untuk tanggal lokal (tanggal non-UTC) yang dapat Anda gunakan new Date().toLocaleDateString() // "8/26/2019". Tapi kemudian membandingkan teks tidak akan akurat (suka "8/26/2019" >= "9/29/2001"salah). Jadi, Anda harus mengonversinya new Date(new Date().toLocaleDateString())untuk secara akurat dibandingkan dengan Tanggal lainnya.
stomy
4

Cukup gunakan toDateString () di kedua tanggal. toDateString tidak termasuk waktu, jadi untuk 2 kali pada tanggal yang sama, nilainya akan sama, seperti yang ditunjukkan di bawah ini.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

Jelas beberapa kekhawatiran zona waktu yang dinyatakan di tempat lain tentang pertanyaan ini valid, tetapi dalam banyak skenario, itu tidak relevan.

Mike Feltman
sumber
1
Dalam kasus saya, solusi ini jauh lebih baik daripada jawaban yang dipilih dan jawaban yang lebih banyak dipilih. Secara eksplisit dikatakan dalam judul "tanpa membandingkan waktu", solusi ini tepat, menghemat kebutuhan untuk mengatur waktu untuk memanipulasi perbandingan. Untuk menjawab "Apakah peristiwa X dan peristiwa Y terjadi pada hari yang sama" lebih masuk akal untuk membandingkan tanggal yang adil, daripada menjawab "Apakah 00: 00: 00.00 dari tanggal acara X persis sama dengan 00:00: 00.00 dari tanggal acara Y? " itulah yang dilakukan oleh banyak penjawab lainnya
Mr.K
3

Inilah cara saya melakukannya:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}
Fabrizio
sumber
Saat ini saya menggunakan ini dalam produksi dan saya tidak memiliki masalah atau ketidakcocokan browser dll ... ada alasan mengapa Anda mengatakan itu getTime()diperlukan?
Fabrizio
5
Perlu diketahui bahwa setHours()memodifikasi objek yang dipanggil, dan mengembalikan tanggal sebagai beberapa milidetik (setara dengan panggilan getTime()). Oleh karena itu todayvariabel Anda bukan Dateobjek seperti yang diharapkan beberapa orang, tetapi sebenarnya adalah bilangan bulat milidetik. Sebagai efek samping, inilah mengapa Anda tidak perlu menelepon getTime()sebelum membandingkan, karena Anda sudah menggunakan cara yang tidak jelas.
Timothy Walters
3

Karena saya tidak melihat pendekatan serupa di sini, dan saya tidak menikmati pengaturan h / m / s / ms ke 0, karena dapat menyebabkan masalah dengan transisi yang akurat ke zona waktu lokal dengan dateobjek yang diubah (saya kira begitu), biarkan saya perkenalkan di sini ini, yang ditulis beberapa saat yang lalu, fungsi lil:

+: Mudah digunakan, membuat operasi perbandingan dasar dilakukan (membandingkan hari, bulan dan tahun tanpa waktu.)
-: Tampaknya ini adalah kebalikan dari pemikiran "out of the box".

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Pemakaian:

datecompare(date1, '===', date2)untuk pemeriksaan kesetaraan,
datecompare(date1, '>', date2)untuk pemeriksaan yang lebih besar,
!datecompare(date1, '>', date2)untuk pemeriksaan yang kurang atau sama

Juga, jelas, Anda dapat beralih date1dan date2di tempat untuk mencapai perbandingan sederhana lainnya.

Max Yari
sumber
Bagus, plus plus, membantu saya keluar, sekarang mudah-mudahan konversi iso tidak menggigit, haha, thx.
edencorbin
3

Cara yang efisien dan benar untuk membandingkan tanggal adalah:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Itu mengabaikan bagian waktu, itu bekerja untuk zona waktu yang berbeda, dan Anda dapat membandingkan untuk kesetaraan ==juga. 86400000 adalah jumlah milidetik dalam sehari (= 24*60*60*1000 ).

Hati-hati bahwa operator kesetaraan ==harus tidak pernah digunakan untuk membandingkan Tanggal benda karena gagal ketika Anda harapkan tes kesetaraan untuk bekerja karena membandingkan dua Tanggal benda (dan tidak membandingkan dua tanggal) misalnya:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Catatan: Jika Anda membandingkan objek Date yang bagian waktunya disetel ke nol, maka Anda bisa menggunakan date1.getTime() == date2.getTime()tetapi itu tidak sebanding dengan optimasi. Anda dapat menggunakan <, >, <=, atau >=ketika membandingkan Tanggal objek langsung karena operator ini pertama mengkonversi objek Tanggal dengan menelepon .valueOf()sebelum operator melakukan perbandingan.

Robocat
sumber
2

Setelah membaca pertanyaan ini waktu yang sama persis setelah diposting saya telah memutuskan untuk mengirim solusi lain, karena saya tidak menemukan yang cukup memuaskan, setidaknya untuk kebutuhan saya:

Saya telah menggunakan sesuatu seperti ini:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

Dengan cara itu saya bisa menggunakan tanggal dalam format yang saya inginkan untuk diproses sesudahnya. Tapi ini hanya untuk kebutuhan saya, tetapi saya telah memutuskan untuk mengirimnya, mungkin itu akan membantu seseorang

Aleks
sumber
1
Harap perhatikan bahwa currentDatevariabel Anda bukan tanggal, ini adalah beberapa milidetik sejak 1970-01-01. The setHours()Metode memodifikasi objek tanggal itu disebut pada, dan kembali setara dengan getTime()(nilai tanggal dalam milidetik sejak 1970/01/01).
Timothy Walters
1

Pastikan Anda membuat userDatedengan tahun 4 digit sebagai setFullYear(10, ...) !== setFullYear(2010, ...).

Alex K.
sumber
1

Anda dapat menggunakan beberapa aritmatika dengan total ms.

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

Saya suka ini karena tidak ada pembaruan untuk tanggal asli dibuat dan kinerja lebih cepat daripada perpecahan string dan membandingkan.

Semoga bantuan ini!

Miguel
sumber
1

JS ini akan mengubah konten setelah tanggal yang ditetapkan di sini adalah hal yang sama tetapi di w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->

NICHOLAS WOJNAR
sumber
1

Ini bekerja untuk saya:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

Dalam jawaban yang diterima, ada masalah zona waktu dan di waktu lain tidak 00:00:00

Yogesh Devgun
sumber
0

Saya tahu pertanyaan ini telah dijawab dan ini mungkin bukan cara terbaik, tetapi dalam skenario saya ini berfungsi dengan baik, jadi saya pikir ini dapat membantu orang seperti saya.

jika Anda memiliki date stringsebagai

String dateString="2018-01-01T18:19:12.543";

dan Anda hanya ingin membandingkan bagian tanggal dengan objek Tanggal lainnya di JS,

var anotherDate=new Date(); //some date

maka Anda harus convertyang stringkeDate objek dengan menggunakannew Date("2018-01-01T18:19:12.543");

dan inilah triknya: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Saya telah menggunakan toDateString()dariDate object JS, yang mengembalikan Tanggal tali saja.

Catatan: Jangan lupa untuk menggunakan .valueOf() fungsi saat membandingkan tanggal.

info lebih lanjut .valeOf()ada di sini referensi

Selamat codding.

RK Sharma
sumber
0

Ini akan membantu. Saya berhasil mendapatkannya seperti ini.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
Hiran DA Walawage
sumber
0

Membandingkan dengan setHours()akan menjadi solusi. Sampel:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}
Chandrashekhar Kase
sumber
0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

jika format tanggal Anda berbeda maka gunakan moment.js perpustakaan untuk mengonversi format tanggal Anda dan kemudian gunakan kode di atas untuk membandingkan dua tanggal

Contoh:

Jika Tanggal Anda di "DD / MM / YYYY" dan ingin mengubahnya menjadi "MM / DD / YYYY" maka lihat contoh kode di bawah ini

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);
Pritesh Singh
sumber
0

Anda dapat menggunakan fp_incr (0). Yang menetapkan bagian zona waktu ke tengah malam dan mengembalikan objek tanggal.

pengguna2849789
sumber