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())
date1 === date2
tutarlı bir davranış sağlamadığını unutmayın;date1.valueOf() === b.valueOf()
hatta yapmak daha iyidate1.getTime() === date2.getTime()
. Acayiplik.