09 Oca 2025·7 dk okuma

Yaz saati (DST) hataları: zaman damgaları ve raporlar için kurallar

Yaz saati (DST) hatalarını önlemek için pratik kurallar: temiz zaman damgaları saklayın, doğru yerel zamanı gösterin ve kullanıcıların doğrulayabileceği güvenilir raporlar oluşturun.

Yaz saati (DST) hataları: zaman damgaları ve raporlar için kurallar

Bu hatalar normal ürünlerde neden olur

Zaman hataları, insanların UTC'de yaşamadığı için çıkar. İnsanlar yerel saatte yaşar ve yerel saatler ileri atılabilir, geri alınabilir veya yıllar içinde kuralları değişebilir. İki kullanıcı aynı anı farklı saatlerle görebilir. Daha kötüsü, aynı yerel saat iki farklı gerçek ana işaret edebilir.

Yaz saati (DST) hataları genellikle yılda sadece iki kez ortaya çıkar, bu yüzden gözden kaçabilir. Geliştirmede her şey düzgün görünür, sonra gerçek bir müşteri geçiş haftasonunda randevu ayarlar, mesai girer veya rapora bakar ve bir şeyler yanlış görünür.

Ekipler genellikle önce birkaç modeli fark eder: planlanmış öğelerin kaybolduğu veya kaydığı “kayıp saat”, günlüklerin veya uyarıların çift göründüğü, ve bir “gün”ün 23 veya 25 saat olması nedeniyle günlük toplamların kaydığı durum.

Bu sadece geliştirici sorunu değildir. Destekte “uygulamanız toplantı zamanımı değiştirdi” diye biletler gelir. Finans günlük gelirlerin uyuşmadığını görür. Operasyon neden gece işler iki kez çalıştı veya atlandı diye merak eder. Hatta “bugün oluşturuldu” filtreleri farklı bölgelerdeki kullanıcılar arasında anlaşamayabilir.

Hedef sıkıcı ama güvenilir: zamanı anlamını kaybettirmeyecek şekilde saklayın, yerel zamanı insanların beklediği biçimde gösterin ve tuhaf günlerde bile doğru kalan raporlar oluşturun. Bunu yaptığınızda işin her bir parçası sayılara güvenebilir.

İster özel kodla ister AppMaster gibi bir platformla inşa edin, kurallar aynıdır. Orijinal anı koruyan zaman damgaları ve o anın nasıl göründüğünü açıklayacak yeterli bağlam (kullanıcının zaman dilimi gibi) istersiniz.

Zamanın kısa ve sade bir modeli

Çoğu DST hatası “bir an” ile “saatin gösterdiği” şeyi karıştırmamızdan kaynaklanır. Bu fikirleri ayrı tutun, kurallar çok daha basit olur.

Kısa terimler:

  • Zaman damgası: zaman çizelgesindeki kesin bir an (nerede olduğunuzdan bağımsız).
  • UTC: zaman damgalarını tutarlı göstermek için kullanılan küresel referans saati.
  • Yerel zaman: bir kişinin oradaki duvar saatinde gördüğü saat (örneğin New York'ta 09:00).
  • Ofset: bir andaki UTC farkı, örneğin +02:00 veya -05:00 şeklinde yazılır.
  • Zaman dilimi: tarih için ofseti belirleyen kurallar kümesi, örneğin America/New_York.

Bir ofset bir zaman dilimi ile aynı şey değildir. -05:00 sadece tek bir andaki UTC farkını söyler. Yaz aylarında -04:00 olup olmayacağını veya yasaların gelecek yıl değişip değişmeyeceğini söylemez. Bir zaman dilimi adı bunu söyler, çünkü kuralları ve geçmişi taşır.

DST ofseti değiştirir, temel zaman damgasını değil. Olay hâlâ aynı anda oldu; sadece yerel saat etiketi değişir.

İki durum çoğu karışıklığa neden olur:

  • Bahar atlaması: saat ileri atılır, bu yüzden bazı yerel saat aralıkları hiç var olmaz (örneğin 02:30 mümkün olmayabilir).
  • Sonbahar tekrar: saat geri alınır, bu yüzden aynı yerel saat iki kez olur (örneğin 01:30 iki anlamlı an olabilir).

Bir destek bileti sonbahar tekrarında “01:30” oluşturulduysa, olayları doğru sıraya koymak için zaman dilimi ve kesin an (UTC zaman damgası) gerekir.

Çoğu sorunu önleyen veri kuralları

Çoğu DST hatası biçimlendirme sorunu değil, veri sorunudur. Saklanan değer belirsizse, sonraki her ekran ve rapor tahmin yapmak zorunda kalır ve bu tahminler uyuşmaz.

Kural 1: Gerçek olayları mutlak an (UTC) olarak saklayın

Bir şey belirli bir anda olduysa (ödeme alınması, bilet cevabı, mesai başlangıcı), zaman damgasını UTC olarak saklayın. UTC ileri veya geri atlamaz, bu yüzden DST değişikliklerinde sabit kalır.

Örnek: Bir New York destek görevlisi saat değişim gününde yerel saatle 09:15’te yanıt veriyorsa, UTC anını saklamak, bir Londra kullanıcısı daha sonra konuyu incelediğinde yanıtın doğru sırada kalmasını sağlar.

Kural 2: Zaman dilimi bağlamını IANA kimliği olarak tutun

Zamanı insan dilinde göstermeniz gerektiğinde kullanıcının veya yerin zaman dilimini bilmeniz gerekir. Bunu America/New_York veya Europe/London gibi IANA zaman dilimi kimliği olarak saklayın, “EST” gibi belirsiz etiketler yerine. Kısaltmalar farklı şeyler anlamına gelebilir ve yalnızca ofsetler DST kurallarını kapsamaz.

Basit bir desen: olay zamanı UTC olarak, ayrıca kullanıcıya, ofise, mağazaya veya cihaza iliştirilmiş ayrı bir zaman dilimi kimliği.

Kural 3: Sadece tarih olan değerleri tarih olarak saklayın, zaman damgası olarak değil

Doğum günleri, “5’inde yenilenir” ve “fatura vadesi” gibi bazı değerler gerçek anlar değildir. Bunları tarih alanı olarak saklayın. Zaman damgası olarak saklarsanız, saat dilimi dönüşümleri onları bir önceki veya sonraki güne taşıyabilir.

Kural 4: Yerel zamanı bağlam olmadan düz metin olarak saklamayın

“2026-03-08 02:30” veya “9:00 AM” gibi zamanları zaman dilimi olmadan kaydetmekten kaçının. Bu zaman DST geçişlerinde belirsiz (iki kez oluşan) veya imkansız (atlanan) olabilir.

Yerel giriş kabul etmeniz gerekiyorsa, hem yerel değeri hem de zaman dilimi kimliğini saklayın ve gerçek olay anı için UTC'ye dönüştürün.

Her kayıt türü için ne saklanacağına karar verme

Birçok DST hatası bir kayıt türünün başka gibi muamele görmesinden kaynaklanır. Bir denetim kaydı, takvim toplantısı ve bordro kesintisi hepsi “tarih ve saat” gibi görünür ama doğru kalmaları için farklı verilere ihtiyaç duyarlar.

Geçmiş olaylar için (zaten olmuş şeyler): genellikle kesin bir an, yani UTC zaman damgası saklayın. Kullanıcının o zamanki zaman dilimini (örneğin America/New_York) de saklayarak ekranın nasıl göründüğünü daha sonra yeniden inşa edebilirsiniz; kullanıcı profilini değiştirse bile geçmiş kayıtları yeniden yazmayın.

Planlama için (yerel duvar saatiyle gerçekleşmesi gerekenler): niyet edilen yerel tarih ve saat ile zaman dilimi kimliğini saklayın. Bunu UTC'ye çevirmeyip orijinali atmayın. “10 Mart, 09:00 Europe/Berlin” niyettir. UTC, kurallar değiştiğinde türetilmiş bir değer olabilir.

Değişiklikler normaldir: insanlar seyahat eder, ofisler taşınır, şirket politikaları değişir. Geçmiş kayıtları kullanıcı profilindeki zaman dilimi güncellemesiyle yeniden yazmayın. Gelecekteki planlar için, programın kullanıcıyı mı takip edeceğine (seyahat dostu) yoksa sabit bir konumu mu takip edeceğine (ofis dostu) karar verin ve o konumun zaman dilimini saklayın.

Sadece yerel zaman damgalarına sahip miras veriler zordur. Kaynak zaman dilimini biliyorsanız, onu iliştirin ve eski zamanı yerel olarak ele alın. Bilmiyorsanız, onu “yüzen” (floating) olarak işaretleyin ve raporlarda dürüst olun (örneğin saklanan değeri dönüştürmeden gösterin). Bu tip verileri ayrı alanlar olarak modellemek, ekranların bunları karıştırmasını önler.

Adım adım: zaman damgalarını güvenli şekilde saklama

Reports that stay honest
Make daily totals consistent by choosing a reporting time zone and applying it everywhere.
Create Report

DST hatalarını durdurmak için veritabanı için tek, belirsiz olmayan bir kayıt sistemi seçin ve yalnızca gösterirken dönüştürün.

Ekibiniz için kuralı yazılı hale getirin: veritabanındaki tüm zaman damgaları UTC'dir. Bunu belgelere ve tarih işlemenin yakınındaki kod yorumlarına ekleyin. Bu karar yanlışlıkla geri alınabilecek türdendir.

Pratik bir saklama deseni:

  • Kayıt sistemi olarak UTC'yi seçin ve alan adlarını belirgin yapın (created_at_utc gibi).
  • Gerçekte ihtiyaç duyduğunuz alanları ekleyin: bir olay zamanı UTC (occurred_at_utc) ve yerel bağlam gerekliyse tz_id (IANA kimliği) gibi.
  • Girdi alırken yerel tarih/saat ve tz_id toplayın, sonra sınırda (API veya form gönderimi) bir kez UTC'ye çevirin. Katmanlar arasında tekrar tekrar dönüştürmeyin.
  • Kaydetme ve sorgulamayı UTC'de yapın. Yerel zamana dönüşümü yalnızca kenarlarda (UI, e-posta, dışa aktarım) yapın.
  • Kritik işlemler (ödeme, uyum, planlama) için ayrıca aldığınızı da kaydedin (orijinal yerel metin, tz_id ve hesaplanan UTC). Bu, zaman tartışmalarında denetim izi sağlar.

Örnek: bir kullanıcı America/Los_Angeles’ta “5 Kasım 09:00” planlarsa, occurred_at_utc = 2026-11-05T17:00:00Z ve tz_id = America/Los_Angeles kaydedin. DST kuralları sonra değişse bile neyi kastettiklerini ve ne saklandığını açıklayabilirsiniz.

PostgreSQL’de modelliyorsanız (görsel veri modelleme araçları dahil), sütun türlerini açık ve tutarlı yapın ve uygulamanın her zaman UTC yazmasını zorunlu kılın.

Kullanıcıların anlayacağı şekilde yerel zamanı gösterme

Tame DST edge cases
Handle missing and repeated times with clear choices at input, not surprises later.
Try It

Çoğu DST hatası veritabanında değil, kullanıcı arayüzünde ortaya çıkar. İnsanlar gösterdiğiniz metni okur, mesajlara kopyalar ve ona göre plan yapar. Ekran belirsizse kullanıcı yanlış varsayar.

Zaman önemliyse (rezervasyonlar, biletler, randevular, teslimat pencereleri), fiş gibi gösterin: eksiksiz, belli ve etiketli.

Gösterimi tahmin edilebilir tutun:

  • Tarih + saat + zaman dilimini gösterin (örnek: “10 Mar 2026, 09:30 America/New_York”).
  • Zaman dilimi etiketini saatin yanında gösterin, ayarlarda gizlemeyin.
  • Göreli metin gösteriyorsanız (“2 saat içinde”), tam zaman damgasını yakınlarda tutun.
  • Paylaşılan öğelerde izleyenin yerel zamanı ile olayın zaman dilimini birlikte gösterebilirsiniz.

DST kenar durumları için açık davranış belirleyin. Kullanıcılara herhangi bir zaman girmelerine izin verirseniz, eninde sonunda hiç oluşmayan veya iki kez oluşan bir zaman kabul edersiniz.

  • Bahar ileri (atlanan zamanlar): geçersiz seçimleri engelleyin ve sonraki geçerli zamanı önerin.
  • Sonbahar geri (belirsiz zamanlar): ofseti veya net bir seçim gösterin (örneğin “01:30 UTC-4” vs “01:30 UTC-5”).
  • Mevcut kaydı düzenleme: biçim değişse bile orijinal anı koruyun.

Örnek: Berlin’de bir destek görevlisi New York’ta bir müşteriyle “3 Kasım 01:30” için çağrı ayarlarsa, sonbahar tekrarında New York’ta o saat iki kez olur. UI “3 Kasım 01:30 (UTC-4)” gösterirse kafa karışıklığı gider.

Yalan söylemeyen raporlar oluşturma

Raporlar, aynı verinin görüntüleyene göre farklı toplamlar verdiğinde güveni bozar. DST hatalarını önlemek için bir raporun aslında neyi gruplayacağını seçin ve ona bağlı kalın.

İlk olarak her rapor için “gün”ün ne anlama geldiğini seçin. Destek takımı genellikle müşterinin yerel günüyle düşünür. Finans genellikle hesabın yasal zaman dilimini ister. Bazı teknik raporlar UTC günlerinde daha güvenlidir.

Yerel güne göre gruplayınca DST etrafında toplamlar değişir. Bahar ileri gününde bir yerel saat atlanır. Sonbahar geri gününde bir saat tekrar eder. Eğer “yerel tarih”e göre gruplayıp açık bir kural belirtmezseniz yoğun bir saat kaybolmuş, iki kat veya yanlış güne taşınmış görünebilir.

Pratik bir kural: her raporun bir raporlama zaman dilimi olsun ve bu başlıkta görünür olsun (örnek: “Tüm tarihler America/New_York olarak gösterilmiştir”). Bu matematiği öngörülebilir kılar ve destek için açık bir referans verir.

Çok bölgeli ekipler için kullanıcıların rapor zaman dilimini değiştirmesine izin vermek uygundur; ancak bu farklı bir bakış olarak değerlendirilmelidir. İki izleyici DST geçişleri ve gece yarısına yakın zamanlarda farklı günlük kutular görebilir. Bu normaldir, rapor seçili bölgeyi açıkça belirttiği sürece.

Birkaç seçim çoğu sürprizi önler:

  • Rapor günü sınırını tanımlayın (kullanıcı bölgesi, hesap bölgesi veya UTC) ve belgelenmiş olsun.
  • Bir rapor çalışması için tek bir zaman dilimi kullanın ve tarih aralığının yanında gösterin.
  • Günlük toplamlar için seçilen bölgedeki yerel tarihe göre gruplayın (UTC tarihine göre değil).
  • Saatlik grafiklerde sonbahar tekrarındaki tekrar eden saatleri etiketleyin.
  • Süreler için geçen saniyeleri saklayın ve sonra görüntüleyin.

Süreler özel dikkat ister. Sonbahar geri döneminde geçen 2 saatlik bir vardiya duvar-saati olarak 3 saat görünse bile, çalışan gerçekten 2 saat çalıştıysa geçen süre hâlâ 2 saattir. Kullanıcıların hangi anlamı beklediğine karar verin ve tutarlı yuvarlama uygulayın (örneğin satır başına yuvarlamak yerine toplam aldıktan sonra yuvarlayın).

Yaygın tuzaklar ve nasıl kaçınılır

Add time you can prove
Create an audit trail with stored UTC, zone ID, and original input for disputed timestamps.
Get Started

DST hataları “zor matematik” değildir. Zaman içinde sızan küçük varsayımlardan kaynaklanır.

Klasik bir hata, yerel bir zaman damgası kaydedip ona UTC etiketi yapıştırmaktır. Her şey düzgün görünür ta ki başka bir saat dilimindeki biri kaydı açana kadar ve değer sessizce kayar. Daha güvenli kural basittir: bir anı (UTC) saklayın ve yerel yoruma ihtiyaç varsa doğru bağlamı (kullanıcı veya lokasyon zaman dilimi) yanında tutun.

Bir diğer sık hata sabit ofsetleri kullanmaktır (örneğin -05:00). Ofsetler DST değişiklikleri veya tarihsel kurallar hakkında bilgi içermez. America/New_York gibi gerçek IANA zaman dilimi kimlikleri kullanın.

Bazı alışkanlıklar birçok “çift vardiya” sürprizini önler:

  • Kenarlarda dönüştürün: girdiyi bir kere ayrıştırın, bir kere saklayın, bir kere gösterin.
  • “An” alanları (UTC) ile “duvar saati” alanları (yerel tarih/saat) arasında net bir çizgi tutun.
  • Yerel yoruma bağlı kayıtlarla birlikte zaman dilimi kimliğini saklayın.
  • Sunucu saat dilimini önemsiz kılın; her zaman UTC okuyup yazın.
  • Raporlar için raporlama zaman dilimini tanımlayın ve UI'da gösterin.

Gizli dönüşümlere dikkat edin. Yaygın bir örnek: kullanıcının yerel zamanını UTC'ye çevirip kaydedersiniz, sonra bir UI kütüphanesi değeri yerel sanıp tekrar dönüştürür. Sonuç bir saatlik kayma olur ve bu sadece bazı kullanıcılar ve bazı tarihlerde görünür.

Son olarak, faturalama veya uyum için istemci cihaz zaman dilimini kullanmayın. Seyahat eden bir telefon seyahat sırasında bölge değiştirebilir. Bunun yerine bu tür raporları açık bir iş kuralına dayandırın, örneğin müşterinin hesap zaman dilimi veya bir site lokasyonu.

Test etme: çoğu hatayı yakalayan birkaç vaka

Çoğu zaman hatası yılda sadece birkaç günde ortaya çıkar, bu yüzden QA'dan kaçırılır. Çözüm doğru anları test etmek ve bu testleri tekrarlanabilir kılmaktır.

Bir DST uygulayan zaman dilimi seçin (örneğin America/New_York veya Europe/Berlin) ve iki geçiş günü için test yazın. Ardından DST kullanmayan bir bölge seçin (Asia/Singapore veya Africa/Nairobi) ve farkı görün.

Sonsuza kadar saklanmaya değer 5 test

  • Bahar ileri günü: atlanan saatin planlanamayacağını doğrulayın ve dönüşümlerin var olmayan bir zaman icat etmediğini kontrol edin.
  • Sonbahar geri günü: tekrar eden saati doğrulayın; iki farklı UTC anının aynı yerel zamanı gösterdiğini ve günlük/raporların bunları ayırt edebildiğini kontrol edin.
  • Geceyarısını aşan aralıklar: yerel saatte geceyarısını geçen bir olay oluşturun ve UTC'de görüntülendiğinde sıralama ve gruplamanın doğru kaldığını doğrulayın.
  • DST olmayan karşıt: aynı tarihlerde DST olmayan bir bölgede dönüşümü tekrar edin ve sonuçların stabil kaldığını doğrulayın.
  • Rapor anlık görüntüleri: ay sonu ve DST haftasonu çevresinde beklenen toplamları kaydedin ve her değişiklikten sonra çıktıyı karşılaştırın.

Somut bir senaryo

Bir destek ekibi sonbahar tekrar gecesinde “01:30” takip planlarsa, UI sadece gösterilen yerel zamanı saklıyorsa hangi “01:30” kastedildiğini bilemezsiniz. İyi bir test, yerel olarak 01:30'a karşılık gelen her iki UTC zaman damgasını oluşturur ve uygulamanın bunları ayırt ettiğini doğrular.

Bu testler hızla sisteminizin doğru gerçekleri (UTC anı, zaman dilimi kimliği ve bazen orijinal yerel zaman) saklayıp saklamadığını ve saatler değiştiğinde raporların dürüst kalıp kalmadığını gösterir.

Yayına almadan önce hızlı kontrol listesi

Fix time at the schema
Design clear timestamp and date-only fields in a visual PostgreSQL data model.
Model Data

Yaz saati hataları uygulama çoğu gün doğru göründüğü için sızar. Zaman gösteren, tarihe göre filtreleyen veya rapor dışa aktaran her şeyi yayımlamadan önce bu kontrol listesini kullanın.

  • Her rapor için tek bir raporlama zaman dilimi seçin (örneğin “İş Merkezi Saati” veya “Kullanıcının Saati”). Bunu rapor başlığında gösterin ve tablolar, toplamlar ve grafikler arasında tutarlı tutun.
  • Her “an”ı UTC olarak saklayın (created_at, paid_at, message_sent_at). Yerel bağlam gerektiğinde IANA zaman dilimi kimliğini saklayın.
  • DST uygulanabilecek durumlarda “UTC-5” gibi sabit ofsetlerle hesaplamalar yapmayın. Tarih için zaman dilimi kurallarını kullanarak dönüştürün.
  • Zamanları her yerde açıkça etiketleyin (UI, e-posta, dışa aktarma). Tarih, saat ve zaman dilimini dahil edin ki ekran görüntüleri ve CSV'ler yanlış anlaşılmasın.
  • Küçük bir DST test seti tutun: bahar atlamasından hemen önce bir zaman damgası, hemen sonra bir tane ve sonbahar tekrar saati çevresinde aynı şekilde.

Gerçekçi kontrol: New York'ta bir destek yöneticisi “Pazar günü oluşturulan biletler”i dışa aktarıyorsa ve Londra'daki bir ekip arkadaşı dosyayı açıyorsa, her ikisi de zaman damgalarının hangi zaman dilimini temsil ettiğini tahmin etmeden söyleyebilmelidir.

Örnek: zaman dilimleri arasında çalışan gerçek bir destek akışı

Make time rules repeatable
Turn your DST checklist into reusable components your team can apply to every feature.
Try AppMaster

Bir müşteri New York'ta yaz saati uygulamasına geçmişken bilet açar, ama destek ekibiniz Londra'dadır.

12 Mart'ta müşteri yerel saatle 09:30'da bileti oluşturur. Bu an 13:30 UTC'dir, çünkü New York o hafta artık UTC-4'tür. Bir Londra temsilcisi 14:10 Londra saatinde yanıt verir; o hafta Londra hâlâ UTC+0 olduğundan bu 14:10 UTC olur. Yanıt, bilet oluşturulmasından 40 dakika sonra gelmiştir.

Sadece yerel zamanı ve zaman dilimi kimliğini saklamazsanız nasıl bozulur:

  • “09:30” ve “14:10” düz zaman damgaları olarak kaydedilir.
  • Daha sonra bir rapor işi New York'un her zaman UTC-5 olduğunu varsayar (veya sunucu saat dilimini kullanır).
  • 09:30’u 14:30 UTC olarak dönüştürür, oysa doğru olan 13:30 UTC’dır.
  • SLA saatiniz 1 saat sapan olur ve 2 saatlik SLA’yı karşılayan bir bilet geç gösterilmiş olabilir.

Daha güvenli model UI ve raporlamayı tutarlı tutar. Olay zamanını UTC zaman damgası olarak saklayın ve ilgili IANA zaman dilimi kimliğini (müşteri için America/New_York, temsilci için Europe/London) saklayın. UI'da aynı UTC anını, saklanan tarihe uygulanan kuralları kullanarak izleyicinin zaman dilimine göre gösterin.

Haftalık rapor için net bir kural seçin: “müşteri yerel gününe göre grupla.” Gün sınırlarını America/New_York'ta hesaplayın (geceden geceye), sonra bu sınırları UTC'ye çevirip o aralıkta yer alan biletleri sayın. Sayılar DST hafta boyunca bile stabil kalır.

Sonraki adımlar: uygulamanızda zaman işleme tutarlılığını sağlamak

Ürününüz DST hatalarından etkilendiyse, en hızlı çıkış yolu birkaç kural yazıp hepsine uygulamaktır. “Büyük ölçüde tutarlı” olmak zaman problemlerinin yeridir.

Kuralları kısa ve net tutun:

  • Saklama formatı: ne saklanacağı (genellikle UTC anı) ve asla saklanmayacak olan (zaman dilimi olmadan belirsiz yerel zaman).
  • Rapor zaman dilimi: raporların varsayılan olarak hangi bölgeyi kullandığı ve kullanıcıların nasıl değiştirebileceği.
  • UI etiketleme: zamanların yanında ne görünür (“10 Mar, 09:00 (America/New_York)” vs sadece “09:00”).
  • Yuvarlama kuralları: zamanı hangi kutularla (saat, gün, hafta) gruplayacağınız ve bu kutuların hangi bölgeyi takip ettiği.
  • Denetim alanları: hangi zaman damgalarının “olay gerçekleşti” anlamına geldiği ve hangilerinin “kayıt oluşturuldu/güncellendi” olduğunu belirtin.

Düşük riskli bir şekilde uygulamaya geçirin. Önce yeni kayıtları düzeltin ki sorun büyümesin. Ardından geçmiş veriyi partiler halinde taşıyın. Taşıma sırasında hem orijinal değeri (varsa) hem de normalleştirilmiş değeri yeterince uzun tutun ki raporlardaki farkları görebilesiniz.

AppMaster (appmaster.io) kullanıyorsanız, pratik faydalardan biri bu kuralları veri modelinizde ve paylaşılan iş mantığında merkezi hale getirmektir: UTC zaman damgalarını tutarlı saklayın, yerel anlam gereken kayıtlarla birlikte IANA zaman dilimi kimliklerini tutun ve dönüştürmeleri girdi ve gösterim sınırlarında uygulayın.

Bir sonraki pratik adım, zaman dilimine güvenli tek bir rapor oluşturmak (örneğin “günde çözülen biletler”) ve bu raporu yukarıdaki test vakalarıyla doğrulamaktır. Eğer bir DST geçiş haftasında iki farklı zaman diliminde doğru kalırsa, iyi durumdasınız demektir.

SSS

Why do DST bugs happen even when the code looks correct?

Yaz saati uygulaması (DST) yerel saat farkını değiştirir, gerçek olay anını değil. Yerel saat okumasını gerçek bir an gibi ele alırsanız, baharda “kaybolan” saatler ve sonbaharda “çift” saatler görürsünüz.

What’s the safest way to store timestamps in a database?

Gerçek olayları UTC'de, yani mutlak bir an olarak saklayın; böylece ofsetler değişse bile değer yerinden oynamaz. Görüntülerken yalnızca görüntüleyenin yerel zamanına dönüştürün ve dönüşümler için gerçek bir zaman dilimi kimliği kullanın.

Why can’t I store just a UTC offset instead of a time zone name?

Bir -05:00 gibi ofset sadece o an için UTC farkını söyler; DST kurallarını veya geçmişi içermez. America/New_York gibi bir IANA zaman dilimi adı, tarih bazlı doğru dönüşümler yapabilmek için gerekli kuralları taşır.

When should I store a value as a date instead of a timestamp?

Gerçek an olmayan değerleri (doğum günü, fatura vadesi, “her ayın 5’inde yenilenir” gibi) tarih alanı olarak saklayın. Bunları zaman damgası olarak saklamak, saat dilimi dönüşümleri yüzünden bir günü önceye veya sonrasına taşıyabilir.

How should my app handle times that are skipped or repeated during DST switches?

Baharda bazı yerel saatler hiç oluşmayabilir — uygulama geçersiz seçimleri engellemeli ve kullanıcıya bir sonraki geçerli zamanı önermeli. Sonbaharda ise aynı yerel saat iki kez oluşur; UI kullanıcının hangi örneği kastettiğini seçmesine izin vermeli (örneğin, ofset göstererek).

Should I convert scheduled meetings to UTC when saving them?

Planlama verilerinde kullanıcının niyeti önemlidir: niyet edilen yerel tarih/saat ile tz_id (zaman dilimi kimliği) saklayın. Çalıştırma için türetilmiş bir UTC anı saklayabilirsiniz ama orijinal yerel niyeti atmayın; kurallar değiştiğinde anlam kaybolur.

How do I stop reports from showing different daily totals for different users?

Her rapor için bir raporlama zaman dilimi seçin ve başlıkta görünür yapın, böylece “gün”ün ne anlama geldiği bellidir. Yerel güne göre gruplayınca DST yakınlarında günler 23 veya 25 saat olabilir; bunu açıkça belirttiğiniz sürece tutarlılığı korursunuz.

What’s the most common mistake that causes the “one-hour shift” bug?

Çoğu “bir saatlik kayma” hatası, bir katmanın zaman damgasını yerel sanıp diğerinin UTC sanmasıyla oluşur. Girdi bir kere ayrıştırılmalı, bir kere saklanmalı ve gösterim için bir kere formatlanmalıdır; çift dönüşümden kaçının.

How should I calculate durations across DST changes?

Süreleri mutlak birim (örneğin saniye) olarak saklayın ve sonra topladıktan sonra gösterime çevirin. Ücret bordrosu, SLA veya vardiya süresi gibi durumlarda kullanıcıların hangi anlamı beklediğini belirleyin: duvar-saati mi yoksa geçen süre mi? Sonra tutarlı yuvarlama uygulayın.

What tests catch most DST bugs before customers do?

En az bir DST uygulayan zaman diliminde iki geçiş günü için testler yazın ve bir DST uygulamayan bölgeyle (örneğin Asia/Singapore veya Africa/Nairobi) karşılaştırın. Kaybolan saat, tekrar eden saat, gece yarısı geçişleri ve rapor gruplama testleri genelde en çok hatayı yakalar.

Başlaması kolay
Harika bir şey yaratın

Ücretsiz planla AppMaster ile denemeler yapın.
Hazır olduğunuzda uygun aboneliği seçebilirsiniz.

Başlayın