W jakim formacie będzie wyświetlona data po uruchomieniu przedstawionego kodu?
<?php echo date('l, dS F Y'); ?>
A. Monday, 10th July 17
B. Monday, 10 July 2017
C. Monday, 10th July 2017
D. 10, Monday July 2017
Pytanie z egzaminu CKE, styczeń 2019 (arkusz E.14-X-19.01).
Wynik wynika bezpośrednio z formatu przekazanego do funkcji date() w PHP. Zapis date('l, dS F Y') składa się z kilku specjalnych znaków formatujących. Litera l oznacza pełną angielską nazwę dnia tygodnia, czyli na przykład Monday. Przecinek i spacje są traktowane dosłownie, więc pojawią się w wyniku dokładnie w tych miejscach. Symbol d oznacza dzień miesiąca zapisany jako dwie cyfry, np. 10 albo 05. Symbol S dodaje angielski przyrostek porządkowy, czyli st, nd, rd albo th, dlatego dla 10 dostajemy 10th. Litera F oznacza pełną angielską nazwę miesiąca, np. July, a Y oznacza pełny, czterocyfrowy rok, czyli 2017. Dlatego format odpowiada zapisowi: Monday, 10th July 2017. W praktyce warto pamiętać, że date() używa aktualnej daty i strefy czasowej serwera, jeśli nie podamy drugiego argumentu z timestampem. W dobrym kodzie produkcyjnym często ustawia się strefę czasową przez date_default_timezone_set(), a dane w bazie przechowuje raczej w formacie neutralnym, np. ISO 8601 lub UTC, dopiero potem formatując je dla użytkownika. Moim zdaniem to jest jedna z tych funkcji PHP, które wyglądają banalnie, ale łatwo się pomylić na pojedynczej literce.
W tym pytaniu kluczowe jest rozróżnienie, które znaki w napisie formatującym są zwykłym tekstem, a które są specjalnymi symbolami funkcji date() w PHP. Kod nie wypisuje daty w dowolnej kolejności, tylko dokładnie według wzorca l, dS F Y. Jeżeli wynik zaczynałby się od liczby dnia, na przykład 10, Monday July 2017, to format musiałby zaczynać się od d albo j, a nie od l. Tutaj pierwszym elementem jest pełna nazwa dnia tygodnia, więc zapis startuje od Monday. Brak przyrostka th też byłby pomyłką, bo po d występuje S, a ten symbol odpowiada za angielski przyrostek liczebnika porządkowego. Zapis Monday, 10th July 17 miesza z kolei dwa różne symbole roku: małe y daje rok dwucyfrowy, czyli 17, natomiast wielkie Y daje rok czterocyfrowy, czyli 2017. To częsty błąd, bo w PHP wielkość liter w formacie daty ma znaczenie. Zapis Monday, 10 July 2017 wygląda blisko poprawnego, ale pomija S, więc nie pokazuje formy 10th. Warto też zauważyć, że PHP date() domyślnie zwraca nazwy dni i miesięcy po angielsku, a nie po polsku. Jeśli aplikacja ma działać lokalnie dla użytkowników z Polski, lepszą praktyką bywa użycie IntlDateFormatter albo innego mechanizmu lokalizacji. Samo date() jest dobre do prostych formatów technicznych, ale trzeba bardzo uważnie czytać każdy znak wzorca.