Timestamp i “odległe” daty w PHP - problem roku 2038
Pracując nad obsługą dat w PHP napotkałem problem, który jest bardzo często niezauważany lub pomijany. Otóż timestamp (czyli liczba sekund, która upłynęła od dnia 1 stycznia 1970) jest w PHP przechowywany i przetwarzany jako integer. Cóż z tego? Otóż ogranicza to jego reprezentację do 32 bitów, a mówiąc wprost najbardziej odległą datą jaką można zapisać w takim timestampie jest 19 stycznia 2038. Co jeśli interesuje mnie praca z późniejszymi datami? Krótko mówiąc lipa, timestamp w PHP nie przewiduje takiej możliwości. Byćmoże zostanie to rozwiązane w kolejnej wersji PHP.
Wystarczy jednak zajrzeć do świeżo opublikowanego frameworka firmy Zend, a dokładniej do klasy “Zend_Date” (Chapter 8. Zend_Date). Udostępnia ona metody, które umożliwiają obsługę dat późniejszych niż rok 2038. Rozwiązanie to korzystając z biblioteki BCMath wspiera prawie nieograniczone timestampy. Jeśli biblioteka jest nieobecna timestamp jest przechowywany i przetwarzany jako 64 bitowy float, co może powodować błędy i przekłamania podczas operacji, aczkolwiek nadal jest całkiem niezłym rozwiązaniem.
Dodatkowymi zaletami jest:
- proste API,
- internacjonalizacja (tłumaczenia nazw miesięcy, dni tygodnia na ponad 130 języków),
- wsparcie dla ISO_8601 (formaty dat).
Polecam zapoznanie się z pełną specyfikacją frameworka: Zend Framework.
