Eğer giriş arayüzü kontrolü olduğundan, genelliği kaybetmeden biz (düzgün için doğrulamak ... tamsayı olmak :) Ayrı yıl / ay / gün tamsayı olacağını varsayabiliriz. Kullanıcının o yıl BC göstermek için negatif olacaktır diyelim.
Bu yüzden öncelikle ... bariz (kısmi) cevap: checkdate(). Fonksiyon dokümantasyon dediği gibi bu, yıl> = 1 için sadece iyi.
Sen eğer yıl <= 0 yapmak ne sorunu ile sıkışmış bu nedenle yeniden.
Burada bir side-trek yapalım ve bu büyük bir sorun olabilir neden görmek ...
Yukarıdaki linke Wikipedia göre, Jülyen takvimi M.Ö. 45 yılında yürürlüğe girmiştir. Bu takvim bugün kullandığımız Gregoryen takvime özdeş tüm pratik amaçlar için, olduğunu. Fark aralarında ofset on gün orada olduğunu; Jülyen takviminin son günü Perşembe, Ekim 4, 1582 oldu ve bu Gregoryen takvimin ilk günü izledi, Cuma, 15 Ekim, 1582 (hafta içi çevrim etkilenmedi).
Bu zaten 14 Ekim 1582 aralığında 5 Ekim 1582 tarihler de (dahil) geçersiz if you are following the Gregorian calendar olduğu anlamına gelir; onlar hiçbir zaman yaşamadılar.
Oradan geriye doğru gidiyor, 'M.Ö. 45 yılına kadar iyisin. M.Ö. 46 geriye, Roman calendar Julian yerine kullanılmıştır.
Ben burada bir karışıklık içine gidecek, ama sadece bu takvim Gregoryen oldukça farklı olduğu için, kullanıcıların bir "Roma takvim tarih giriş formu" görmek için hazır olmayacak söz değil 'm. Benim önerim daha iyi teknik olarak doğru daha da app kullanışlı hale vardır.
Onların aklı kimse aslında güne M.Ö. tarihini bilmek, ya da düzgün belirtmek için nasıl olacağı varsayılabilir Eğer onlar olsa bile, keyfi tüm tarihler M.Ö. formu 1/1/YEAR sahip olduğunu varsayalım olabilir . Bir "BC" onay kutusu işaretli ise arayüz nedenle ay / gün kontrollerini devre dışı olabilir, ayrı grup M.Ö. kutuları ve AD, veya uygun başka bir şey var.
Bütün bunlardan sonra geriye kalan tek sorun, ben gördüğünüz gibi, artık yıl boyunca tarihlerini kontrol ediyor. Bu idi introduced with the Julian calendar, but not actually implemented correctly until 8 AD.
4 AD (dahil) artık yıl doğru hesaplanmış değil - 45 MÖ belgelerde yukarıda son halka. Bu tutarsızlık, artı Julian / Gregoryen anahtarı için hesapları A-yıl-sıçrama fonksiyonu olacaktır:
define('YEAR_JULIAN_CALENDAR_INTRODUCED', -45);
define('YEAR_JULIAN_CALENDAR_LEAP_IMPLEMENTED_CORRECTLY', 8);
define('YEAR_GREGORIAN_CALENDAR_INTRODUCED', 1582);
function is_leap_year($year) {
if($year < YEAR_JULIAN_CALENDAR_INTRODUCED) {
return false; // or good luck :)
}
if($year < YEAR_JULIAN_CALENDAR_LEAP_IMPLEMENTED_CORRECTLY) {
return $year <= -9 && $year % 3 == 0;
}
if($year < YEAR_GREGORIAN_CALENDAR_INTRODUCED) {
return $year % 4 == 0;
}
// Otherwise, Gregorian is in effect
return $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0);
}
Bu donanmış, daha sonra doğru her yıl orada kaç gün söyler bir işlev yazabilirsiniz. Tarih çıkarma / ekleme o üzerine inşa edilebilir.
Bütün bu tartışmalardan sonra (Ben bu kadar :) ben sormak zorunda okuma herkesin cesaret hayran yapın:
How much accuracy do you actually need?
Eğer "teknik detaylar" hakkında anal gerekir karar verirseniz, ben şahsen yukarıda belirtilen fonksiyonları uygulamak istiyorum, ve sonra: a) Benim el işi tarih kütüphanesi olarak onları kullanın, veya b) kontrol etmek için bunları kullanın herhangi bir 3-rd taraf kitaplığı Ben is actually implemented correctly ilgileniyorum.
Bunu yapmak için ihtiyacınız yoksa, sadece tüm bu okumak hiç taklit. :)