Doğum tarihi alanı basit görünen ama sınırlarında en çok hata üreten alanlardan biridir. Bu yazıda artık yılın neden özel bir tarih yarattığını, yaşın hangi gün dolduğunu, “bugün” kavramının saat dilimine göre nasıl değiştiğini ve test verisi hazırlarken hangi uç örnekleri bulundurmanız gerektiğini bulacaksınız.
Artık yıl kuralı 29 Şubat’ı neden özel yapar?
Takvim, dünyanın güneş çevresindeki turuyla tam olarak örtüşmediği için araya ek günler konur. Kullanılan kural şudur: yıl dörde tam bölünüyorsa artık yıldır; ancak yüzyıl başlangıcı olan yıllar için ek bir koşul vardır, o yıl dört yüze de tam bölünmelidir. Bu yüzden on dokuzuncu yüzyılın son yılı artık yıl değilken, iki bin yılı artık yıldı.
Kuralın pratik sonucu, 29 Şubat tarihinin her yıl geçerli olmamasıdır. Doğum tarihi alanını yalnızca gün ve ay üzerinden doğrulayan bir kod, 29 Şubat’ı hiçbir zaman reddetmez; yılın artık yıl olup olmadığını denetleyen bir kod ise bu tarihi bazı yıllarda reddeder. İkisi arasındaki fark, yalnızca şubat ayının son gününde ortaya çıktığı için gözden kaçması kolaydır.
Test verisi hazırlarken bu tarihi mutlaka kapsamak gerekir. Ayrıca 29 Şubat doğumlu bir kişi için yaş hesabının nasıl yapıldığı da ayrı bir karardır: artık yıl olmayan yıllarda doğum günü olarak 28 Şubat mı, 1 Mart mı kabul edilecek? Bu kararın ürün tarafından bilinçli verilmesi gerekir, çünkü iki seçim bir günlük farkla farklı sonuç üretir.
Yaş hesabında doğum günü sayılır mı?
Yaş, geçen tam yıl sayısıdır ve doğum gününün gelip gelmediğine göre belirlenir. Yaygın kabul, doğum günü geldiğinde yeni yaşın başladığıdır; yani bugün doğum günü olan bir kişi o gün itibarıyla yeni yaşını doldurmuş sayılır. Bu kabul, sınır günlerinde sonucu doğrudan değiştirir.
Bu yüzden yaş hesabı ile tarih karşılaştırması birbirine karıştırılmamalıdır. İki tarihi çıkarıp gün sayısını yıla bölmek, doğum günü henüz gelmemiş kişiler için yanlış sonuç verir. Doğru yöntem, önce yıl farkını almak, sonra ay ve günü karşılaştırarak doğum gününün geçip geçmediğine bakmaktır.
Sınır durumları burada yoğunlaşır: dün doğum gününü kutlamış bir kişi, bugün doğum günü olan bir kişi ve yarın doğum gününü kutlayacak bir kişi. Yaş sınırı içeren bir akışta bu üç örnek birbirinden farklı sonuç üretmelidir; üçü de aynı sonucu veriyorsa yaş hesabı büyük olasılıkla yanlış kurulmuştur. Bu sınırların sınanması ayrı bir konudur ve yaş doğrulama testleri yazısında ayrıntılı olarak ele alıyoruz.
“Bugün” hangi saat diliminde belirlenir?
Yaş hesabı her zaman bir referans ana ihtiyaç duyar ve bu ana genellikle “şimdi”dir. Sunucunun saati ile kullanıcının saati aynı olmayabilir; hatta aynı ülke içinde birden fazla saat dilimi bulunabilir. Bu fark, günün belirli saatlerinde bir günlük sapma üretir.
Somut sonucu şudur: gece yarısına yakın bir anda yapılan bir işlemde, sunucu yeni güne geçmişken kullanıcı hâlâ önceki gündedir. Doğum günü o güne denk gelen bir kişi, bu birkaç saatlik aralıkta sisteme göre ya bir yaş büyük ya da bir yaş küçük görünebilir.
Bu tür sapmalar rastgele görünür çünkü yalnızca belirli saatlerde ortaya çıkar. Test sırasında fark edilmesi için zamanın sabitlenebilir olması gerekir; sistem saatiyle oynayamıyorsanız, hesabın referans anını dışarıdan verilebilir hâle getirmek en pratik çözümdür. Böylece aynı kayıt, farklı anlar için tekrar tekrar sınanabilir.
Farklı takvimler aynı tarihi nasıl farklı yazar?
Dünyada kullanılan tek takvim miladi takvim değildir. Etiyopya, Nepal ve İran gibi ülkeler kendi takvimlerini kullanır; aynı gün, o takvimlerde farklı bir yıl, ay ve gün olarak yazılır. Bir form yalnızca miladi tarih bekliyorsa, kullanıcının kendi takviminde yazdığı tarih sisteme yanlış girebilir.
Bu fark, veri doğrulamanın ötesinde bir sorundur: tarihin hangi takvime ait olduğu kaydedilmezse, sonradan yapılan bütün karşılaştırmalar hatalı olur. Bu yüzden tarih alanının yanında takvim ya da en azından bir kaynak bilgisi tutmak, ileride ortaya çıkacak karışıklıkları önler.
Ayrıca tarihlerin yazım sırası da ülkeden ülkeye değişir. Gün, ay ve yıl sıralaması her yerde aynı değildir; iki haneli yılların hangi yüzyıla ait olduğu ise ayrı bir belirsizliktir. Kullanıcıya tarihi gün adıyla birlikte gösteren bir seçici sunmak, bu tür hataların büyük bölümünü baştan engeller.
Yer tutucu tarihler neden gerçek doğum tarihi sanılır?
Bazı eski kayıtlarda doğum tarihi alanı bilinmediği için sabit bir tarihle doldurulmuştur. Bu alışkanlık, o tarihin gerçekten bir doğum günü olduğu izlenimini yaratır ve veriyi analiz eden herkesi yanıltır. Bir sistemde aynı tarihin çok sayıda kayıtta görünmesi, genellikle bu tür bir dolgu işleminin işaretidir.
Test verisi üretirken bu tuzağa düşmemek gerekir. Rastgele üretilmiş tarihler her kayıtta farklı olduğu için böyle bir örüntü oluşturmaz; ancak tek bir sabit tarihi bütün kayıtlara koymak, üretilen kümeyi gerçek dışı kılar ve yaş dağılımını da bozar. Kümeyi yaş aralıklarına göre kurmak, hem daha gerçekçi hem de sınır testleri için daha kullanışlıdır.
Doğum tarihi tek başına kişisel veridir; bir ad ya da adresle birleştiğinde kişiyi işaret etme gücü artar. Bu yüzden test ortamlarında gerçek doğum tarihleriyle çalışmak yerine sentetik kayıtlar kullanmak, hem daha güvenli hem de daha esnektir. Veri minimizasyonu ilkeleri için GDPR ve test verisi yazısı yol gösterici olabilir.
Geliştiriciler için: yaşı tarihten hesaplamak
Doğum tarihini saklarken yalnızca tarihi saklayın; saat ve saat dilimi eklemek, aynı gün içinde farklı sonuçlar üreten bir belirsizlik yaratır. Kişinin nerede doğduğu bilgisi ayrı bir alan olarak tutulmalıdır, çünkü tarihin kendisi bu bilgiyi taşımaz.
Yaşı her görüntülemede yeniden hesaplamak, saklanan bir yaş alanına göre daha güvenilirdir. Saklanan yaş, kayıt güncellenmediği sürece yanlış kalır; hesaplanan yaş ise her zaman tutarlıdır. Hesaplama sırasında referans anı dışarıdan alınabilir olmalıdır ki testler sabit bir “bugün” ile çalışabilsin.
Doğrulama katmanında üç kontrol birbirinden ayrılmalıdır: tarihin biçimi geçerli mi, tarih gerçekten var olan bir gün mü, tarih mantıklı bir aralıkta mı? Birinci kontrol yazım hatalarını, ikincisi artık yıl ve ay sonu hatalarını, üçüncüsü ise gelecekteki ya da aşırı eski tarihleri yakalar.
Test kümenizde şu sınır örnekleri bulunsun: doğum günü tam bugün olan kayıt, doğum günü yarın olan kayıt, 29 Şubat doğumlu kayıt, artık yıl olmayan bir yılda 29 Şubat denemesi ve iki haneli yıl içeren eski bir kayıt. Bu beş örnek, tarih kodunuzun gerçekten nerede kırıldığını gösterir. Kaydın diğer alanlarıyla tutarlılığını korumak için kimlik verisi tutarlılığı yazısındaki yaklaşımı uygulayabilirsiniz.
Bu beş örnek şunlardır:
- doğum günü tam bugün olan kayıt
- doğum günü yarın olan kayıt
- 29 Şubat doğumlu kayıt
- artık yıl olmayan bir yılda 29 Şubat denemesi
- iki haneli yıl içeren eski bir kayıt
Sonraki adımlar
Doğum tarihi ve yaş ile ilgili bütün kararları tek bir yerde toplayın: sınır günü, artık yıl davranışı ve referans an. Bu üçü yazılı olmadan, aynı ekip içinde bile farklı varsayımlar oluşur. Bu davranışları denemek için kimlik üreticisi sayfasında bir kayıt üretip doğum tarihi ile yaş alanlarının birlikte nasıl değiştiğine bakabilirsiniz.