0Pricing
PHP Academy · Lekcja

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 time

Konwertowanie 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')); // true

Formatowanie 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 seconds

Znaczniki 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()); // true

date_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 DateTimeZone razem 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

  1. Znaczniki czasu Unix i date()
  2. Klasa DateTime
  3. Działania na datach za pomocą DateInterval
  4. Strefy czasowe w PHP
← Powrót do PHP Academy