Strefy czasowe w PHP
Obsługuj wiele stref czasowych za pomocą DateTimeZone i date_default_timezone_set
Strefy czasowe w PHP to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Dlaczego strefy czasowe mają znaczenie
Jeśli aplikacja obsługuje użytkowników z całego świata, prawidłowa obsługa stref czasowych ma kluczowe znaczenie. PHP udostępnia funkcje i klasy uwzględniające strefy czasowe, które poprawnie obsługują konwersje.
- Zawsze przechowuj czasy w bazie danych w strefie UTC
- Konwertuj je do lokalnej strefy czasowej użytkownika dopiero na potrzeby wyświetlania
date_default_timezone_set()
Ustaw domyślną strefę czasową dla wszystkich funkcji daty:
<?php
// Set at the top of your script or in php.ini
date_default_timezone_set('Europe/Istanbul');
echo date('Y-m-d H:i:s'); // local Istanbul time
echo PHP_EOL;
date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s'); // UTC time
// Or set in php.ini:
// date.timezone = "Europe/London"Klasa DateTimeZone
Utwórz obiekty stref czasowych, aby używać ich z DateTime:
<?php
$utc = new DateTimeZone('UTC');
$istanbul = new DateTimeZone('Europe/Istanbul');
$ny = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $utc);
echo $dt->format('Y-m-d H:i:s T'); // UTC timeKonwertowanie między strefami czasowymi
Przekonwertuj obiekt DateTime do innej strefy czasowej za pomocą setTimezone():
<?php
$utcTime = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$istanbul = clone $utcTime;
$istanbul->setTimezone(new DateTimeZone('Europe/Istanbul'));
$newYork = clone $utcTime;
$newYork->setTimezone(new DateTimeZone('America/New_York'));
echo 'UTC: ' . $utcTime->format('H:i T') . PHP_EOL;
echo 'Istanbul: ' . $istanbul->format('H:i T') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i T') . PHP_EOL;getOffset() i czas letni
Pobierz przesunięcie względem UTC w sekundach i sprawdź, czy obowiązuje czas letni:
<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);
$offset = $tz->getOffset($dt); // offset in seconds
$offsetHours = $offset / 3600;
echo 'Offset: ' . $offsetHours . 'h'; // e.g. -5 or -4 in DST
$transitions = $tz->getTransitions(
strtotime('2024-01-01'),
strtotime('2024-12-31')
);
echo 'DST changes in 2024: ' . count($transitions);Przechowywanie w UTC i wyświetlanie lokalnie
Najlepsza praktyka: przechowuj dane w bazie w strefie UTC, a użytkownikowi wyświetlaj czas lokalny:
<?php
// Store: always save as UTC
$createdAt = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
->format('Y-m-d H:i:s');
// Display: convert to user's timezone
$userTz = new DateTimeZone($user['timezone'] ?? 'UTC');
$display = (new DateTime($createdAt, new DateTimeZone('UTC')))
->setTimezone($userTz)
->format('d M Y, H:i T');Wykrywanie strefy czasowej użytkownika
Wykryj i zapisz strefę czasową użytkownika na potrzeby wyświetlania:
// JavaScript: detect and send to PHP:
// const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
// fetch('/api/set-timezone', { method:'POST', body: tz });
<?php
// PHP: validate and store
$tz = $_POST['timezone'] ?? 'UTC';
$valid = in_array($tz, DateTimeZone::listIdentifiers());
if ($valid) {
$_SESSION['timezone'] = $tz;
setcookie('user_tz', $tz, time() + 365 * 86400);
}DateTimeZone::listIdentifiers()
Pobierz wszystkie prawidłowe identyfikatory stref czasowych:
<?php
// All identifiers
$all = DateTimeZone::listIdentifiers();
echo count($all) . ' timezones available';
// Filter by region
$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
echo count($europe) . ' European timezones';
// Check if a timezone string is valid
function isValidTimezone(string $tz): bool {
return in_array($tz, DateTimeZone::listIdentifiers());
}
var_dump(isValidTimezone('Europe/Istanbul')); // trueFormatowanie przesunięcia strefy czasowej
Sformatuj przesunięcie strefy czasowej na potrzeby wyświetlania i interfejsów API:
<?php
$dt = new DateTime('now', new DateTimeZone('America/Los_Angeles'));
echo $dt->format('P'); // +05:30 or -07:00
echo $dt->format('O'); // +0530 (no colon)
echo $dt->format('T'); // PST or PDT
echo $dt->format('e'); // America/Los_Angeles
echo $dt->format('Z'); // offset in secondsZnaczniki czasu Unix są niezależne od strefy czasowej
Znaczniki czasu Unix reprezentują konkretny moment niezależnie od strefy czasowej — używaj ich do porównań i obliczeń:
<?php
// These represent the same moment:
$utc = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$ist = new DateTime('2024-05-27 15:00:00', new DateTimeZone('Asia/Kolkata'));
echo $utc->getTimestamp(); // same timestamp
echo $ist->getTimestamp(); // same timestamp
var_dump($utc->getTimestamp() === $ist->getTimestamp()); // truedate_create ze strefą czasową
Proceduralna obsługa stref czasowych za pomocą date_create i date_timezone_set:
<?php
$dt = date_create('now', timezone_open('UTC'));
$tz = timezone_open('Europe/Istanbul');
date_timezone_set($dt, $tz);
echo date_format($dt, 'Y-m-d H:i:s T');
// Check transition info
$info = timezone_transitions_get($tz);
echo 'Current offset: ' . ($info[0]['offset'] / 3600) . 'h';Szybkie sprawdzenie
Gdzie należy przechowywać daty i godziny w bazie danych aplikacji działającej globalnie?
Podsumowanie: strefy czasowe w PHP
Najważniejsze informacje o strefach czasowych:
- Ustawiaj domyślną strefę czasową za pomocą
date_default_timezone_set() - Używaj obiektów
DateTimeZonerazem z DateTime - Używaj
setTimezone()do konwertowania między strefami - Zawsze przechowuj dane w bazie w strefie UTC
- Weryfikuj strefy czasowe użytkowników za pomocą
DateTimeZone::listIdentifiers() - Znaczniki czasu Unix reprezentują momenty niezależne od strefy czasowej
Często zadawane pytania
Czy lekcja „Strefy czasowe w PHP” jest bezpłatna?
Tak — pełny tekst „Strefy czasowe w PHP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Strefy czasowe w PHP”?
Obsługuj wiele stref czasowych za pomocą DateTimeZone i date_default_timezone_set Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Strefy czasowe w PHP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Znaczniki czasu Unix i date()
- Klasa DateTime
- Działania na datach za pomocą DateInterval
- Strefy czasowe w PHP