Moment js tarih saat karşılaştırması


384

Tarih saatimi biçimlendirmek için moment.js kullanıyorum, burada iki tarih değerim var ve bir tarih diğerinden daha büyük olduğunda belirli bir işleve ulaşmak istiyorum. Dokümanlarının çoğunu okudum, ancak bunu başaracak işlevi bulamadım. Orada olacağını biliyorum.

Bu benim kodum:

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 {

}

Düzenle

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

Burada, iki tarihi karşılaştırıyorum 2014-03-24T01:15:000 > 2014-03-24T01:14:000, birincisinin ikincisinden daha büyük olmasını bekliyorum, ama her zaman başka koşullara gidiyor. Neden bilmiyorum?

Yanıtlar:


540

Ben aradığınız inanıyoruz sorgu fonksiyonları , isBefore, isSame, ve isAfter.

Ama tam olarak ne yapmaya çalıştığınızı söylemek biraz zor. Belki de sadece giriş zamanı ve şimdiki zaman arasındaki farkı elde etmek mi istiyorsunuz? Eğer öyleyse, düşünün fark fonksiyonu , diff. Örneğin:

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

Birkaç şey daha:

  • İlk satırda bir hata var:

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

    Bu işe yaramayacak. Sanırım demek istedin:

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

    Elbette şunları da yapabilirsiniz:

    var date_time = '2013-03-24T10:15:20:12Z';
  • .tz('UTC')Yanlış kullanıyorsunuz . moment-zaman dilimine.tz aittir . Örneğin, diğer saat dilimleriyle çalışmadığınız sürece bunu kullanmanıza gerek yoktur .America/Los_Angeles

    Bir değeri UTC olarak ayrıştırmak istiyorsanız, şunu kullanın:

    moment.utc(theStringToParse)

    Veya, yerel bir değeri ayrıştırmak ve UTC'ye dönüştürmek istiyorsanız, şunu kullanın:

    moment(theStringToParse).utc()

    Ya da belki de hiç ihtiyacınız yok. Girdi değerinin UTC olması, işleviniz boyunca UTC'de çalışmanız gerektiği anlamına gelmez.

  • "Şimdi" örneğini şu anda alıyorsunuz moment(new Date()). Bunun yerine sadece kullanabilirsiniz moment().

Güncellenmiş

Düzenlemenize dayanarak, bunu yapabileceğinizi düşünüyorum:

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

Veya alanlarınızın doğru biçimde doğrulandığından emin olmak istiyorsanız:

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

1
Değerli yorumlarınız için teşekkürler. Kodunuzu yorumlarınızı içerecek şekilde düzenledim, ancak farkı doğru bir şekilde almadım. Düzenlenmiş kodumu kontrol edebilir misiniz
Dibish

3
Güncellenmiş cevaba bakınız. Ayrıca saniye alanındaki basamak sayısını da izleyin. Ve req.body.timezonebundan başka bir şey var Zmı? Öyleyse ne olmuş?
Matt Johnson-Pint

Düzenlenmiş kodunuz için çok teşekkür ederim, neredeyse oraya ulaştım .. Benim durumumda, anı kullandığımda (date_time = 2014-03-25T23: 10 + 5: 30) o zaman dilimi numarasına sahibim (date_time) .utc () biraz zaman var Geçersiz tarih
Dibish

1
+05: 30 koyduğumda harika çalışıyor. Nezaketiniz için bir kez daha teşekkür ederiz
Dibish

.isSame () tam olarak aradığım şeydi. Bir şekilde daha önce dokümanlarda özledim.
Strohl

231

Bunları doğrudan karşılaştırabilmelisiniz.

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

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


87
Bunun işe yaradığını açıklamaya değer gibi hissediyorum, çünkü javascript nesneleri Object.prototype.valueOfbir çağ olarak zaman damgasını sayı olarak döndürmek için şu an prototipte geçersiz kılınan ilkellere zorlar . Yani buna benzer now.format('x') > date.format('x').
tandrewnichols

hayır onun çalışmıyor ... İşte ben denedim. // newDate, bugünün tarihinden daha yüksektir ... bu nedenle baskılar hem daha büyük hem de lessthen koşullarda başarısız olur. const resDate = res.url.expiryDate; const newDate = moment (resDate); şimdi var = moment (). biçimi ("GG / AA / YYYY"); if (şimdi <newDate) {console.log ("success"); } else {console.log ("başarısız")}
steve

3
@steve moment().format("DD/MM/YYYY")bir dize döndürür ve sonra alfabetik olarak karşılaştırırsınız ve sonra 1 Aralık 2 Ocak'tan önce gelir, çünkü günler de önde gidiyorsunuz. format()An itirazlarını doğrudan karşılaştırmak istiyorsanız kullanmayın .
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"));

DateTimeA dateTimeB değerinden büyükse yöntem 1 döndürür

DateTimeA dateTimeB'ye eşitse yöntem 0 döndürür

DateTimeA dateTimeB değerinden küçükse yöntem -1 değerini döndürür


1
fonksiyon karşılaştırması1 (dateTimeA, dateTimeB) {dönüş momenti (dateTimeA, 'AA / GG / YYYY'). diff (dateTimeB, 'AA / GG / YYYY'); }
Shamseer

23

Senin datetime doğru olduğunu Önemli olan ISO biçiminde herhangi kullanırken momentjs sorgular : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Dolayısıyla, 2014-03-24T01: 14: 000 yerine, tarih saatiniz şunlardan biri olmalıdır:

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

aksi takdirde aşağıdaki kullanımdan kaldırma uyarısı alabilirsiniz ve durum yanlış olarak değerlendirilir:

Kullanımdan kaldırma uyarısı: sağlanan değer, tanınan bir RFC2822 veya ISO biçiminde değil. an yapı tüm tarayıcılarda ve sürümlerde güvenilir olmayan js Date () 'e geri döner. RFC2822 / ISO dışı tarih biçimleri önerilmez ve yakında çıkacak olan büyük sürümde kaldırılacaktır. Daha fazla bilgi için lütfen http://momentjs.com/guides/#/warnings/js-date/ adresine bakın .

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


10

böyle anı tarih geçmek ve karşılaştırmak ve sonuç verecektir. Biçim istemiyorsanız kaldırın

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulBu iki dizeyi karşılaştırmaktan başka bir şey değil
Pranoy Sarkar

@PranoySarkar lütfen bana neden daha dikkatli olmamız gerektiğini söyleyebilir misiniz?
DEEPESH KUMAR R


2

tarih-saat karşılaştırması valueOfiçin, karşılaştırma için en iyi tarih-saat milisaniye sağlayan anın işlevini kullanabilirsiniz :

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>


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;
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.