Perbandingan waktu tanggal js saat ini

384

Saya menggunakan moment.js untuk memformat waktu tanggal saya, di sini saya memiliki dua nilai tanggal, dan saya ingin mencapai fungsi tertentu ketika satu tanggal lebih besar dari yang lain. Saya membaca sebagian besar dokumen mereka, tetapi tidak menemukan fungsi untuk mencapai ini. Saya tahu itu akan ada di sana.

Ini kode saya:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

Edit

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

Di sini, saya membandingkan dua tanggal yaitu 2014-03-24T01:15:000 > 2014-03-24T01:14:000, berharap bahwa yang pertama lebih besar dari yang kedua, tetapi selalu pergi ke kondisi yang lain. Saya tidak tahu kenapa?

Dibish
sumber

Jawaban:

540

Saya percaya Anda sedang mencari fungsi query , isBefore, isSame, dan isAfter.

Tetapi agak sulit untuk mengatakan dengan tepat apa yang Anda coba. Mungkin Anda hanya mencari perbedaan antara waktu input dan waktu saat ini? Jika demikian, mempertimbangkan fungsi perbedaan , diff. Sebagai contoh:

moment().diff(date_time, 'minutes')

Beberapa hal lain:

  • Ada kesalahan di baris pertama:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    Itu tidak akan berhasil. Saya pikir Anda maksud:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    Tentu saja, Anda mungkin juga:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Anda menggunakan: .tz('UTC')salah. .tzmilik zona waktu-saat . Anda tidak perlu menggunakannya kecuali jika Anda bekerja dengan zona waktu lain America/Los_Angeles.

    Jika Anda ingin mem-parsing nilai sebagai UTC, maka gunakan:

    moment.utc(theStringToParse)

    Atau, jika Anda ingin menguraikan nilai lokal dan mengonversinya menjadi UTC, maka gunakan:

    moment(theStringToParse).utc()

    Atau mungkin Anda tidak membutuhkannya sama sekali. Hanya karena nilai input dalam UTC, tidak berarti Anda harus bekerja di UTC di seluruh fungsi Anda.

  • Anda tampaknya mendapatkan contoh "sekarang" oleh moment(new Date()). Anda bisa menggunakan saja moment().

Diperbarui

Berdasarkan hasil edit Anda, saya pikir Anda bisa melakukan ini:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

Atau, jika Anda ingin memastikan bahwa bidang Anda divalidasi berada dalam format yang benar:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');
Matt Johnson-Pint
sumber
1
Terima kasih atas komentar Anda yang berharga. Saya telah mengedit kode saya untuk memasukkan komentar Anda tetapi tidak mendapatkan perbedaan dengan benar. Bisakah Anda periksa kode saya yang diedit
Dibish
3
Lihat jawaban yang diperbarui. Perhatikan juga jumlah digit di bidang detik. Dan req.body.timezoneadakah yang lebih dari itu Z? Jika ya, apa?
Matt Johnson-Pint
Terima kasih banyak untuk kode yang Anda edit, saya hampir sampai di sana .. Dalam kasus saya, saya memiliki nomor zona waktu dari sisi pengguna misalnya date_time = 2014-03-25T23: 10 + 5: 30, ketika saya menggunakan momen (date_time) .utc () beberapa kali saya mendapat tanggal tidak valid
Dibish
1
Ketika saya menempatkan +05: 30 itu bekerja dengan baik. Sekali lagi terima kasih banyak atas kebaikan Anda
Dibish
.isSame () adalah persis apa yang saya cari. Entah bagaimana ia melewatkannya di dokumen sebelumnya.
Will Strohl
231

Anda harus dapat membandingkannya secara langsung.

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}

ryanwinchester
sumber
88
Saya merasa layak untuk menjelaskan bahwa ini bekerja karena javascript memaksa objek ke primitif melalui Object.prototype.valueOfyang ditimpa pada prototipe saat ini untuk mengembalikan timestamp zaman sebagai angka. Jadi ini mirip dengan now.format('x') > date.format('x').
tandrewnichols
tidak ada yang tidak berfungsi ... ini yang saya coba. // newDate lebih tinggi dari tanggal sekarang ... jadi cetakannya gagal baik pada kondisi yang lebih baik dan kemudian const resDate = res.url.expiryDate; const newDate = moment (resDate); var now = format moment (). ("DD / MM / YYYY"); if (now <newDate) {console.log ("success"); } else {console.log ("gagal")}
steve
3
@steve moment().format("DD/MM/YYYY")akan mengembalikan string dan kemudian Anda membandingkan menurut abjad dan kemudian 1 Desember akan datang sebelum 2 Januari, karena Anda juga memimpin beberapa hari. Jangan gunakan format()jika Anda ingin membandingkan momen keberatan secara langsung.
ryanwinchester
28

Jsfiddle: http://jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

Metode mengembalikan 1 jika dateTimeA lebih besar dari dateTimeB

Metode mengembalikan 0 jika dateTimeA sama dengan dateTimeB

Metode mengembalikan -1 jika dateTimeA kurang dari dateTimeB

Razan Paul
sumber
1
fungsi compare1 (dateTimeA, dateTimeB) {return moment (dateTimeA, 'MM / DD / YYYY') .beda (dateTimeB, 'MM / DD / YYYY'); }
Shamseer
23

Adalah penting bahwa datetime Anda dalam benar format ISO ketika menggunakan salah satu pertanyaan momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Jadi alih-alih 2014-03-24T01: 14: 000, datetime Anda harus berupa:

2014-03-24T01: 14: 00 atau 2014-03-24T01: 14: 00.000Z

jika tidak, Anda mungkin menerima peringatan penghentian berikut dan kondisi akan dianggap salah:

Peringatan penghentian: nilai yang diberikan tidak dalam format RFC2822 atau ISO yang diakui. konstruksi saat jatuh kembali ke js Date (), yang tidak dapat diandalkan di semua browser dan versi. Format tanggal non RFC2822 / ISO tidak disarankan dan akan dihapus dalam rilis utama mendatang. Silakan merujuk ke http://momentjs.com/guides/#/warnings/js-date/ untuk info lebih lanjut.

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>

JSON C11
sumber
10

lewat tanggal ke saat seperti ini ia akan membandingkan dan memberikan hasil. jika Anda tidak ingin format menghapusnya

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
vijay kumar
sumber
6
Be carefulini tidak lain adalah membandingkan dua string
Pranoy Sarkar
@PranoySarkar dapatkah Anda memberi tahu saya mengapa kami harus lebih berhati-hati?
DEEPESH KUMAR R
5
moment(d).isAfter(ahead30now); // true

http://momentjs.com/docs/#/query/is-after/

if (moment(d).isAfter(ahead30now)) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}
TV-C-15
sumber
2

untuk perbandingan tanggal-waktu, Anda dapat menggunakan valueOffungsi saat ini yang menyediakan milidetik dari waktu-tanggal, yang terbaik untuk perbandingan:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Tyagi
sumber
1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
isaac
sumber