Eski Date nesnesiyle farklı saat dilimlerinde etkinlik planlamak oldukça zordur. Özellikle saatlerin atlanabileceği veya tekrarlanabileceği yaz saati uygulaması (DST) geçişlerinde bu zorluk daha da artar.
Temporal API'si, belirli bir saat dilimindeki tarih ve saati temsil etmek için Temporal.ZonedDateTime sağlar. Bu sayede, yaz saati geçişleri otomatik ve öngörülebilir bir şekilde yönetilir.
Nasıl uygulanır?
Küresel etkinlikleri koordine etmek ve olası YSU çakışmalarını yönetmek için:
- ZORUNLU: ZonedDateTime oluşturun: Saat dilimine duyarlı bir tarih-saat nesnesi oluşturmak için
Temporal.ZonedDateTime.from()kullanın. - ZORUNLU: Belirsizliği Yönetme: Bir zaman belirsiz olduğunda veya mevcut olmadığında (ör. saat değişiklikleri sırasında) davranışı kontrol etmek için
disambiguationseçeneğini kullanın. - ZORUNLU: Saat Dilimlerini Dönüştürme: Başka bir konumdaki eşdeğer saati görmek için
.withTimeZone()aracını kullanın.
Örnek: Planlama ve Çakışma Tespiti
// 1. Define the event time and target time zone
const date = "2025-03-09";
const time = "02:30"; // This time is skipped in New York during Spring Forward
const timeZone = "America/New_York";
const inputStr = `${date}T${time}[${timeZone}]`;
// 2. Detect conflicts using 'reject'
let hasConflict = false;
try {
// 'reject' throws RangeError if the time is ambiguous or does not exist
Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'reject' });
} catch (e) {
if (e instanceof RangeError) {
hasConflict = true;
console.log("This time falls in a DST transition gap or overlap.");
}
}
// 3. Resolve the time safely using 'compatible' (default)
// 'compatible' will resolve to a valid time even if skipped or repeated
const hostTime = Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'compatible' });
console.log(`Resolved time: ${hostTime.toString()}`);
// 4. Convert to another time zone (e.g., Tokyo)
const tokyoTime = hostTime.withTimeZone("Asia/Tokyo");
// Use toLocaleString() for user-facing display instead of manual hour/minute padding
console.log(`Tokyo time: ${tokyoTime.toLocaleString('en-US', { hour: 'numeric', minute: '2-digit' })}`);
Stratejik Uygulama ve En İyi Uygulamalar
- Belirli bir coğrafi konuma bağlı etkinlikler (belirli bir şehirdeki toplantı gibi) için
Temporal.ZonedDateTimeKULLANIN. - Yaz saati uygulaması geçişleri sırasında planlama çakışmalarını tespit etmeniz ve kullanıcıları bu konuda uyarmanız gerekiyorsa
disambiguation: 'reject'KULLANIN. - Sistemin, çakışmalar olduğunda otomatik olarak uygun bir zaman seçmesini istiyorsanız
disambiguation: 'compatible'(varsayılan) değerini KULLANIN. - Saat dilimi bilgisi içermediği ve yaz saati uygulaması değişikliklerini hesaba katamadığı için global etkinliklerde
Temporal.PlainDateTimeKULLANMAYIN. - Orijinal nesneyi değiştirmeden diğer konumlardaki eşdeğer zamanı hesaplamak için
.withTimeZone()KULLANIN (Temporal nesneler değiştirilemez). - Kullanıcılara yönelik zaman göstergeleri için manuel zaman hesaplamaları ve dolgu yerine yerel
.toLocaleString()biçimlendirmesini (ör.{ hour: 'numeric', minute: '2-digit' }) KULLANIN.
Yedek strateji
Temporal için yedekler ve tarayıcı desteği
Yerel Temporal API'yi henüz desteklemeyen tarayıcılar için özellik algılamayı kullanın ve temporal-polyfill'yi dinamik olarak yükleyin (~15 KB min+gz).
temporal-polyfill öğesini içe aktarmanın, Temporal nesnesini otomatik olarak global kapsama atamadığını unutmayın. Kodunuz globalThis.Temporal değerine bağlıysa bunu açıkça atayın.
// Check if Temporal is supported natively
(async () => {
if (typeof Temporal === 'undefined') {
// Load the polyfill conditionally
const module = await import('https://esm.sh/temporal-polyfill');
globalThis.Temporal = module.Temporal;
// Extend Date.prototype if needed
Date.prototype.toTemporalInstant = module.toTemporalInstant;
}
initializeApp();
})();