Tarih bölümünü yalnızca JavaScript'teki saati karşılaştırmadan karşılaştırma


397

Aşağıdaki kodda sorun nedir?

Belki sadece tarihi değil saati karşılaştırmak daha kolay olurdu. Bunu nasıl yapacağımdan da emin değilim ve aradım, ama tam sorunumu bulamadım.

BTW, iki tarihi bir uyarıda görüntülediğimde, tam olarak aynı görünüyorlar.

Kodum:

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

Tarihleri ​​karşılaştırmak ve saati içermemek için daha basit bir yol var mı?

Yanıtlar:


781

Hala JavaScript öğreniyorum ve zaman olmadan iki tarihi karşılaştırmak için benim için çalışan bulduğum tek yolu setHoursDate nesnesi yöntemini kullanmak ve saat, dakika, saniye ve milisaniye sıfıra ayarlamaktır. Sonra iki tarihi karşılaştırın.

Örneğin,

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

date2saat, dakika, saniye ve milisaniye sıfıra ayarlanacak, ancak date1 onları tarih1 oluşturulduğu saate ayarlayacaktır. Tarih1'deki saat, dakika, saniye ve milisaniyeden kurtulmak için aşağıdakileri yapın:

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

Artık iki tarihi yalnızca zaman öğeleri hakkında endişelenmeden TARİHLER olarak karşılaştırabilirsiniz.


63
Lütfen, tarafından yapılan testlerin date1 === date2tutarlı bir davranış sağlamadığını unutmayın; date1.valueOf() === b.valueOf()hatta yapmak daha iyi date1.getTime() === date2.getTime(). Acayiplik.
Erwin Wessels

4
Dikkatli olun: tarih1 ve tarih2 kış ve yaz aylarındaysa ve addDays (1) ile birinden diğerine yinelemeyi planlıyorsanız, sorun gün ışığından tasarruf nedeniyle aynı saat dilimine sahip olmamalarıdır. İki tarih gerçekten 00: 00: 00: 0'da olmadığı için eşit tarihler vermesi gereken karşılaştırma çalışmaz.
Oliver

9
Bunun eski bir soru olduğunu biliyorum, ancak arama yaparken önce Google'da ortaya çıkıyor. Bu yanıta dikkat edin. Kullanıcı date nesnesinin yaratıcısıyla aynı saat diliminde değilse bu yanlış yanıtlar verir. Örneğin, bilgisayarınızın işletim sistemindeki saat dilimini East Coast (ABD) saatine değiştirin. Tarayıcınızın konsolunu açın ve yazın var date2 = new Date(2011,8,20). Şimdi işletim sisteminin saat dilimini Pasifik Saati (ABD) olarak değiştirin. Aynı tarayıcı konsolu türünde date2.toDateString()ve Mon Sep 19 201120. Salı yerine geri döneceksiniz !
Adam

9
Ayrıca setHours(), tarayıcı tarafından otomatik olarak algılanan geçerli saat dilimine göre zaman ayarladığını unutmayın . Dene: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());yazdır "2016-02-28T15:00:00.000Z", tarih 28, ama değil 29 Geçerli saat dilimimAsia/Tokyo
transang

8
Bu yanıt setUTCxxx, yerel / saat dilimi farkında değişkenler yerine yöntemleri kullanacak şekilde güncellenmelidir .
Stijn de Witt

136

ZAMAN BÖLGESİNE DİKKAT EDİN

Tarih nesnesini hemen bir tarihi temsil etmek için kullanmak, sizi büyük bir aşırı hassasiyet sorununa sokar. Onları uzak tutmak için zaman ve saat dilimini yönetmeniz gerekir ve herhangi bir adımda gizlice girebilirler. Bu soruya kabul edilen cevap tuzağa düşüyor.

Javascript tarihinin saat dilimi fikri yoktur . Varsayılan olarak cihazın "yerel" saat dilimini veya belirtilirse UTC veya başka bir saat dilimini kullanarak, dizelere ve dizelerden çeviri için kullanışlı (statik) işlevlere sahip bir an (zamandan beri keneler). Bir date nesnesiyle just-a-date ™ ' i temsil etmek için, tarihlerinizin söz konusu tarihin başında gece yarısını UTC'yi temsil etmesini istersiniz. Bu, yaratılışlarının mevsimine veya saat dilimine bakılmaksızın tarihlerle çalışmanıza izin veren ortak ve gerekli bir sözleşmedir. Bu nedenle, hem gece yarısı UTC Tarihi nesnenizi oluşturduğunuzda hem de serileştirdiğinizde saat dilimi kavramını yönetmek için çok dikkatli olmanız gerekir.

Birçok kişi, konsolun varsayılan davranışı ile karıştırılır. Konsola bir tarih yazarsanız, gördüğünüz çıktı saat diliminizi içerir. Bunun nedeni, konsolun toString()randevunuzu araması ve toString()size yerel bir temsil vermesidir. Temel tarih saat dilimi içermez ! (Zaman, saat dilimi ofseti ile eşleştiği sürece, hala bir gece yarısı UTC tarih nesnesine sahipsiniz)

Diziselleştirmeyi kaldırma (veya gece yarısı UTC Tarihi nesneleri oluşturma)

Bu, iki "doğru" yanıtın hile ile yuvarlama adımıdır. Çoğu zaman, tarihinizin kullanıcının saat dilimini yansıtmasını istersiniz. Bugün doğum gününüzse tıklayın . NZ ve ABD'deki kullanıcılar aynı anda tıklayıp farklı tarihler alırlar. Bu durumda, bunu yapın ...

// 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()));

Bazen, uluslararası karşılaştırılabilirlik yerel doğruluğu azaltır. Bu durumda, bunu yapın ...

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

Bir tarihin serisini kaldırma

Teldeki tarihler genellikle YYYY-AA-GG biçiminde olur. Bunların serisini kaldırmak için şunu yapın ...

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

Dizgeleştirme

Oluşturduğunuzda saat dilimini yönetmeye özen gösterdikten sonra, bir dize temsiline geri döndüğünüzde saat dilimini uzak tuttuğunuzdan emin olmanız gerekir. Böylece güvenle kullanabilirsiniz ...

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

Ve her şeyden tamamen kaçının, özellikle ...

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

Sorunuzu cevaplamak için 7 yıl çok geç ...

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

Çalıştığını görün ...

2019'u güncelleyin ... ücretsiz şeyler ...

Bu cevabın popülaritesi göz önüne alındığında, hepsini koda koydum. Aşağıdaki işlev bir sarılmış tarih nesnesi döndürür ve yalnızca just-a-date ™ ile kullanımı güvenli olan işlevleri gösterir.

Bir Date nesnesi ile çağırın ve kullanıcının saat dilimini yansıtan JustADate olarak çözülür. Bir dize ile çağırın: dize, saat dilimi belirtilmiş bir ISO 8601 ise, zaman bölümünü yuvarlayacağız. Saat dilimi belirtilmezse, tarih nesnelerinde olduğu gibi yerel saat dilimini yansıtan bir tarihe dönüştürürüz.

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


3
Cevabınız gerçekten değerli bilgiler içeriyor! Maalesef cevabı aslında OP'nin asıl sorusuna eklemediniz, bu yüzden beni yükseltmemizi engellediniz. OP'nin sorusunu yanıtlayan küçük bir kod snippet'i eklemeyi deneyin.
Stijn de Witt

Ha ha ha @ '7 yıl çok geç'! Stil kullanıcısını beğeniyorum1585345! Oyumu sen aldın!
Stijn de Witt

Bunu yararlı buldum. "Uluslararası karşılaştırılabilirlik" snippet'inde bir yazım hatası olduğunu unutmayın. Bence olmalı: new Date (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak

1
Keşke bu cevabı 100 kere oylayabilseydim !!!
Sнаđош26аӽ

77

Buna ne dersin?

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

Değişkeninizin değerini etkilemeden tarihin tarih bölümünü böyle karşılaştırmanıza olanak tanır:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

Bu, orijinal gönderinin en zarif cevabıdır. Ben amaçlarım için ayrı bir işlev oluşturmadı, sadece iki kod satırı dahil.
Danimal Reks

25

Moment.js kullanma

Üçüncü taraf bir kütüphane ekleme seçeneğiniz varsa, kesinlikle Moment.js'ye bir göz atmaya değer . Çalışmayı Dateve DateTimeçok, çok daha kolay hale getirir .

Örneğin, bir Tarihin başka bir Tarihten sonra gelip gelmediğini görmek, ancak saatlerini hariç tutmak, şöyle bir şey yaparsınız:

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

Eğer geçmek İkinci parametre isAfterkarşılaştırma yapmak hassas olup herhangi biri olabilir year, month, week, day, hour, minuteveya second.


4
Bir momentjs çözümünden bir Date () + sethours çözümüne geçerek 100x hıza sahip oldum. dikkatli arkadaşlar :-)
2c2c

@ 2c2c İlginç. Performans etkisini bilmek kesinlikle iyi. Karşılaştırmanız için kaç işlem yaptınız?
Joshua Pinter

1
Ben yaklaşık 1mil karşılaştırmalar oldu. hiç kurulum gerçek bir kriter
2c2c

17

Sadece aşağıdaki gibi .toDateString kullanarak karşılaştırın:

new Date().toDateString();

Bu, tarih veya saat dilimini değil, yalnızca tarih bölümünü döndürür:

"Cum Şub 03 2017"

Dolayısıyla, her iki tarih de zamanın bir parçası olmadan bu biçimde karşılaştırılabilir.


2
Bu iyi bir başlangıç, ancak karşılaştırmaya izin vermiyor çünkü artık bir dize. Karşılaştırma yapmak için, öğeyi Date nesnesi olarak değiştirin new Date(new Date().toDateString());
Grid Trekkor

@GridTrekkor Doğru, ancak hızlı bir eşitlik testi istiyorsanız bu en basit çözümdür.
CM

8

Bu biraz daha temiz bir sürüm olabilir, ayrıca parseInt kullanırken her zaman bir sayı tabanı kullanmanız gerektiğini unutmayın.

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

Sayı tabanı hakkında daha fazla bilgi için MDC ayrıştırma sayfasına bakın.

JSLint , eksik bir sayı tabanı ve belirsiz ve hata ayıklaması zor hatalara neden olabilecek diğer birçok şeyi yakalamak için harika bir araçtır. Sizi daha iyi kodlama standartları kullanmaya zorlar, böylece gelecekteki baş ağrılarından kaçınırsınız. Kodladığım her JavaScript projesinde kullanıyorum.


@EmKay ES5 çoğu tarayıcıda oldukça standart olduğu için bu kadar büyük bir sorun olmamalı ve sekizli yorumlamayı yasaklıyor, ancak bazı tarayıcılar eski uyumluluk nedenlerini geriye dönük uyumluluk nedenleriyle kullanıyor olabilir, bu yüzden bir sayı tabanı kullanmaya devam edeceğim öngörülebilir gelecek için.
Yararsız Kod

Eğer sıkı mod kullanırsanız sekizli yorumlar hatalar atar, bu iyi bir şeydir çünkü yanlış yorumlanabilecek hataları bulmanıza yardımcı olur.
Yararsız Kod

4

Date.js kütüphane bunlar için kullanışlıdır. JS tarihiyle ilgili tüm komut dosyalarını çok daha kolay hale getirir.


11
Bu kütüphanenin bunu nasıl kolaylaştırdığı hakkında daha fazla bilgi ekleyebilir misiniz?
Mahmoud Hanafy

4

Tarihi yalnızca zaman bileşeni olmadan gerçekten karşılaştırıyorsanız, yanlış hissedebilecek, ancak tüm Date()zaman ve saat dilimi baş ağrılarından kaçınan başka bir çözüm, dize karşılaştırmasını kullanarak ISO dize tarihini doğrudan karşılaştırmaktır:

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

Geçerli tarihi (UTC tarihi, kullanıcının yerel tarihi değil) alabilirsiniz:

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

Benim lehime yaptığım argüman programcı basitliğidir - bunu, muhtemelen hız pahasına, tarihler ve ofsetleri doğru bir şekilde ele almaya çalışmaktan çok daha düşük bir olasılıktasınız (performansı karşılaştırmadım)


Siz de yapabilirsiniz new Date().toISOString().substr(0, 10) // "2019-04-22".
stomi

Yerel tarih için (UTC dışı tarih) kullanabilirsiniz new Date().toLocaleDateString() // "8/26/2019". Ama sonra metni karşılaştırmak doğru olmaz ( "8/26/2019" >= "9/29/2001"yanlış gibi ). Dolayısıyla new Date(new Date().toLocaleDateString()), başka bir Tarihle doğru bir şekilde karşılaştırmak için dönüştürmeniz gerekir .
stomi

4

Her iki tarihte de toDateString () kullanın. toDateString, saati içermediğinden, aynı tarihte 2 kez, aşağıda gösterildiği gibi değerler eşit olacaktır.

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

Açıkçası, bu sorunun başka bir yerinde ifade edilen zaman dilimi endişelerinin bazıları geçerlidir, ancak birçok senaryoda bunlar geçerli değildir.


1
Benim durumumda bu çözüm seçilen cevaptan ve daha oylanan cevaplardan çok daha iyi. "Zaman karşılaştırmadan" başlığında açıkça söylenir, bu çözüm tam olarak bunu yapar ve karşılaştırmayı manipüle etmek için zaman ayarlama ihtiyacını ortadan kaldırır. "X olayı ve Y olayı aynı gün gerçekleşti mi?" Y etkinliğinin tarihi 00.00 mı? " diğer pek çok
yanıtcının

3

Ben böyle yapıyorum:

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

Şu anda bunu üretimde kullanıyorum ve herhangi bir sorun veya tarayıcı uyumsuzluğu vb. Yok ... getTime()bunun gerekli olduğunu söylemenizin herhangi bir nedeni var mı?
Fabrizio

5
Lütfen setHours()çağrıldığı nesneyi değiştirdiğini ve tarihi milisaniye (çağrıya eşdeğer getTime()) olarak döndürdüğünü unutmayın . Bu nedenle todaydeğişkeniniz, Datebazılarının beklediği gibi bir nesne değildir , ancak gerçekte milisaniye tamsayıdır. Bir yan etki olarak, bu yüzden getTime()karşılaştırmadan önce aramanıza gerek yoktu , çünkü zaten belirsiz bir şekilde var.
Timothy Walters

3

Burada benzer bir yaklaşım görmediğim için, h / m / s / ms değerini 0 olarak ayarlamaktan hoşlanmıyorum, çünkü değişen datenesne ile yerel saat dilimine doğru geçişle ilgili sorunlara neden olabilir (sanırım), izin ver Bu, birkaç dakika önce yazılmış lil fonksiyonu:

+: Kullanımı kolay, temel bir karşılaştırma işlemi yapar (gün, ay ve yılı zaman olmadan karşılaştırır.)
-: Görünüşe göre bu "kutudan çıkmış" düşüncenin tam tersidir.

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

Kullanımı:

datecompare(date1, '===', date2)eşitlik kontrolü için,
datecompare(date1, '>', date2)daha büyük kontrol
!datecompare(date1, '>', date2)için, daha az veya eşit kontrol için

Ayrıca, açıkçası, geçiş yapabilirsiniz date1ve date2yerlerde hiçbir başka basit bir karşılaştırma elde etmek.


Güzel, artı artı, bana yardımcı oldu, şimdi umarım iso dönüşümleri ısırmaz, haha, thx.
edencorbin

3

Tarihleri ​​karşılaştırmanın etkili ve doğru bir yolu:

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

Zaman bölümünü yok sayar, farklı zaman dilimleri için çalışır ve eşitliği ==de karşılaştırabilirsiniz . 86400000, bir gün içindeki milisaniye sayısıdır ( = 24*60*60*1000).

Eşitlik operatörünün Date nesnelerini karşılaştırmak için asla kullanılmaması ==gerektiğine dikkat edin, çünkü iki Date nesnesini karşılaştırdığı (ve iki tarihi karşılaştırmadığı için) bir eşitlik testinin çalışmasını beklediğinizde başarısız olur.

> 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

Notlar: Zaman kısmı sıfıra ayarlanmış olan Date nesnelerini karşılaştırıyorsanız, kullanabilirsiniz date1.getTime() == date2.getTime()ancak optimizasyona pek değmez. Sen kullanabilirsiniz <, >, <=, veya >=bu operatörler ilk arayarak Date nesnesini dönüştürmek çünkü tarihi karşılaştıran doğrudan nesneleri zaman .valueOf()operatör karşılaştırma yapmadan önce.


2

Bu soruyu gönderildikten sonra aynı anda okuduktan sonra, en azından ihtiyaçlarım için oldukça tatmin edici bulamadığım için başka bir çözüm yayınlamaya karar verdim:

Böyle bir şey kullandım:

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

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

Bu şekilde tarihleri ​​daha sonra işlemek için istediğim formatta kullanabilirdim. Ama bu sadece benim ihtiyacım içindi, ama yine de göndermeye karar verdim, belki birine yardım edecek


1
currentDateDeğişkeninizin bir tarih olmadığını, 1970-01-01'den bu yana geçen milisaniye sayısını lütfen unutmayın . setHours()Yöntem değiştirir tarihi, çağrılır nesne ve döner eşdeğer getTime()(1970-01-01 itibaren milisaniye olarak güncel değeri).
Timothy Walters

1

userDate4 basamaklı bir yıl olarak inşa ettiğinizden emin olun setFullYear(10, ...) !== setFullYear(2010, ...).


1

Toplam ms ile bazı aritmetik kullanabilirsiniz.

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

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

Orijinal tarihler için hiçbir güncelleme yapılmadı ve dize bölün ve karşılaştırın daha hızlı perfom çünkü bunu seviyorum.

Umarım bu yardım!


1

Bu JS, belirlenen tarihten sonra içeriği değiştirecek, ancak aynı şey w3schools'ta

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


1

Bu benim için çalışıyor:

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

Kabul edilen cevapta saat dilimi sorunu var ve diğer zaman 00:00:00 değil


0

Bu sorunun zaten yanıtlandığını biliyorum ve bu en iyi yol olmayabilir, ancak senaryomda mükemmel çalışıyor, bu yüzden benim gibi birine yardımcı olabileceğini düşündüm.

Eğer varsa date stringolarak

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

tarih bölümünü JS'deki başka bir Date nesnesiyle karşılaştırmak istiyorsanız,

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

o zaman gerek için kullanarak nesneconvertstringDatenew Date("2018-01-01T18:19:12.543");

ve işte püf noktası: -

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

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

Ben kullandım toDateString()ait Date objecttarihi dizesini yalnızca döndürür JS ait.

Not: .valueOf()Tarihleri ​​karşılaştırırken işlevi kullanmayı unutmayın .

hakkında daha fazla bilgi .valeOf() burada referans

Mutlu kodlama.


0

Bu yardımcı olacak. Ben böyle başardım.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

İle karşılaştırmak setHours()bir çözüm olacaktır. Örneklem:

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

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

tarih biçiminiz farklıysa , tarih biçiminizi dönüştürmek için moment.js kitaplığını kullanın ve ardından iki tarihi karşılaştırmak için yukarıdaki kodu kullanın

Misal :

Tarihiniz "GG / AA / YYYY" içindeyse ve bunu "AA / GG / YYYY" ye dönüştürmek istiyorsanız, aşağıdaki kod örneğine bakın

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

0

Fp_incr (0) kullanabilirsiniz. Saat dilimi bölümünü gece yarısına ayarlar ve bir tarih nesnesi döndürür.

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.