PHP - datum od roku 1970 do roku 2038

Datum vydání: 2013-02-23 17:25:17; aktualizováno: 2013-02-23 19:51:11

Tak si klidně programuji, a když vše naprogramuji a na závěr testuji, tak zjistím, že mi nejdou zadat roky větší jak 2038. Místo toho se mi vracel 1. 1. 1970. Nemilé překvapení!

Příklad použití pro rok 2042

<?php
echo date('j. n. Y', strtotime('2042-12-31'));
?>

Spuštění kódu

1. 1. 1970

Příklad použití pro rok 2013

<?php
echo date('j. n. Y', strtotime('2013-12-31'));
?>

Spuštění kódu

31. 12. 2013

O tom, že PHP začíná počítat data až od roku 1970, jsem ve skrytu duše věděla. To, že standardní funkce v PHP končí rokem 2038, jsem nevěděla a vzhledem k současnému roku 2013 jde o značné omezení a já vše musím přeprogramovat.

V čem je zakopaný pes 2038

Vše je popsáno samozřejmě v dokumentaci. Např. u funkce mktime, která vrací unixové časové razítko je napsáno, cituji:

„The number of the year, may be a two or four digit value, with values between 0-69 mapping to 2000-2069 and 70-100 to 1970-2000. On systems where time_t is a 32bit signed integer, as most common today, the valid range for year is somewhere between 1901 and 2038. However, before PHP 5.1.0 this range was limited from 1970 to 2038 on some systems (e.g. Windows).“

Konec citace.

Přetečení 32-bitového integeru

Na podobné omezení narazíte u funkcí strtotime, date a u řady dalších funkcí, které také pracují do roku 2038. Vše je způsobeno velikostí 32-bitového integeru. Při zadání vyšší hodnoty dojde k přetečení, viz Year 2038 problem či Problém roku 2038. Čas je uchovávaný jako počet sekund od roku 1970.

Year 2038 problem - wikimedia

DateTime class

Naštěstí existuje DateTime class, která tato omezení nemá, resp. je tam časový prostor o něco málo větší – mělo by to být 292 billionů roků :). Alespoň doufám… Měl by se používat 64-bitový integer. Místo klasických procedur a funkcí pro práci s datem a časem můžete začít používat tuto třídu a její metody. Podpora je od PHP 5. Třída obsahuje spoustu užitečných a příjemných funkcí.

Příklad použití

<?php
$date = new DateTime('2042-12-31');
echo $date->format('Y-m-d');
?>

Spuštění kódu

2042-12-31

Více informací