Arka fon
JavaScript'in Date
nesnesi UTC'de saati dahili olarak izler, ancak genellikle girdiyi kabul eder ve üzerinde çalıştığı bilgisayarın yerel saatinde çıktı üretir. Diğer zaman dilimlerinde zamanla çalışmak için çok az imkan vardır.
Bir Date
nesnenin dahili temsili, 1970-01-01 00:00:00 UTC
artık saniye dikkate alınmadan bu yana geçen milisaniye sayısını temsil eden tek bir sayıdır . Date nesnesinin kendisinde depolanan bir saat dilimi veya dize biçimi yoktur. Date
Nesnenin çeşitli işlevleri kullanıldığında, bilgisayarın yerel saat dilimi dahili gösterime uygulanır. İşlev bir dize üretirse, o dizenin nasıl üretileceğini belirlemek için bilgisayarın yerel bilgileri dikkate alınabilir. Ayrıntılar işleve göre değişir ve bazıları uygulamaya özeldir.
Date
Nesnenin yerel olmayan saat dilimleriyle yapabileceği tek işlemler şunlardır:
Herhangi bir saat diliminden sayısal UTC ofseti içeren bir dizeyi ayrıştırabilir. Ayrıştırılan değeri ayarlamak için bunu kullanır ve UTC eşdeğerini saklar. Orijinal yerel saat ve ofset, elde edilen Date
nesnede tutulmaz . Örneğin:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
ECMASCript Uluslararasılaştırma API'sını ("Intl" olarak da bilinir) uygulayan ortamlarda, Date
nesne belirli bir saat dilimi tanımlayıcısına ayarlanmış yerel ayara özgü bir dize üretebilir. Bu, timeZone
seçenek toLocaleString
ve varyasyonları ile gerçekleştirilir. Çoğu uygulama, IANA zaman dilimi tanımlayıcılarını destekleyecektir 'America/New_York'
. Örneğin:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
Modern ortamların çoğu, IANA zaman dilimi tanımlayıcılarının tamamını destekler ( buradaki uyumluluk tablosuna bakın ). Bununla birlikte, Intl tarafından desteklenmesi gereken tek tanımlayıcının olduğunu unutmayın 'UTC'
, bu nedenle eski tarayıcıları veya atipik ortamları (örneğin, hafif IoT cihazları) desteklemeniz gerekip gerekmediğini dikkatlice kontrol etmeniz gerekir.
Kütüphaneler
Saat dilimleriyle çalışmak için kullanılabilecek birkaç kütüphane vardır. Date
Nesnenin hala farklı davranmasını sağlayamasalar da, genellikle standart IANA saat dilimi veritabanını uygular ve JavaScript'te kullanmak için işlevler sağlarlar. Modern kütüphaneler, Intl API tarafından sağlanan saat dilimi verilerini kullanır, ancak veritabanı biraz daha büyük olabileceğinden, özellikle bir web tarayıcısında çalışıyorsanız eski kütüphanelerin genel olarak ek yükü vardır. Bu kitaplıklardan bazıları, hangi zaman dilimlerinin desteklendiği ve / veya çalışabileceğiniz tarih aralığına göre veri kümesini seçici olarak azaltmanıza izin verir.
Dikkate alınması gereken kütüphaneler şunlardır:
Uluslararası Tabanlı Kütüphaneler
Yeni geliştirme, saat dilimi verileri için Intl API'sine dayanan bu uygulamalardan birini seçmelidir:
Uluslararası Olmayan Kütüphaneler
Bu kütüphaneler korunur, ancak kendi zaman dilimi verilerini paketleme yükünü taşırlar ki bu oldukça büyük olabilir.
* Moment ve Moment-Timezone daha önce önerilmiş olsa da, Moment ekibi artık kullanıcıların yeni geliştirme için Luxon'u seçmesini tercih ediyor.
Durdurulan Kütüphaneler
Bu kütüphaneler resmi olarak sonlandırılmıştır ve artık kullanılmamalıdır.
Gelecek Öneriler
TC39 Zamansal Önerisi amaçları JavaScript dili kendisinde tarihleri ve saatleri ile çalışmak için standart nesneler yeni bir dizi sağlamaktır. Bu, zaman dilimine duyarlı bir nesne için destek içerir.