Obecnie przechowuję czas używając "time ()"funkcja w bazie danych. Jednak używa strefy czasowej serwera i chciałbym, aby każdy użytkownik widział czas zgodnie z jego strefą czasową (ustawioną w swoim profilu).
Jak wykonać konwersję znacznika czasu? (i mam na myśli od znacznika czasu do znacznika czasu, a nie czasu do odczytu)
Odpowiedzi:
9 dla odpowiedzi № 1Jak powiedział Joonas, znaczniki czasu UNIX są z definicji UTC, ale możesz zhakować coś takiego razem, aby naśladować sygnatury czasowe specyficzne dla strefy czasowej, jeśli naprawdę potrzebujesz:
// PHP 5.3 - OO Code
$timestamp = time();
echo "Unix timestamp: " . $timestamp;
$dt = DateTime::createFromFormat("U", $timestamp);
$dt->setTimeZone(new DateTimeZone("America/New_York"));
$adjusted_timestamp = $dt->format("U") + $dt->getOffset();
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;
// PHP 5.3 - Procedural Code
$timestamp = time();
echo "Unix timestamp: " . $timestamp;
$dt = date_create_from_format("U", $timestamp);
date_timezone_set($dt, new DateTimeZone("America/New_York"));
$adjusted_timestamp = date_format($dt, "U") + date_offset_get($dt);
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;
2 dla odpowiedzi nr 2
Naprawdę nie powinieneś hackować samych znaczników czasu, aby zmienić datę w obrębie, powinieneś po prostu stosować strefę czasową do znacznika czasu przed przedstawieniem sformatowanego znacznika daty dla użytkownika.
Jest to zmodyfikowana wersja kodu Mike'a, która powinna działać dla PHP 5> = 5.2.0 jak znaleziono na php.net
// OO Code
$st = 1170288000 // a timestamp
$dt = new DateTime("@$st");
$dt->setTimeZone(new DateTimeZone("America/New_York"));
$adjusted_timestamp = $dt->format("U") + $dt->getOffset();
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;
// Procedural Code
$st = 1170288000 // a timestamp
$dt = date_create("@$st");
date_timezone_set($dt, timezone_open("America/New_York"));
$adjusted_timestamp = date_format($dt, "U") + date_offset_get($dt);
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;
1 dla odpowiedzi nr 3
Znaczniki czasu UNIX są z definicji w UTC, co oznacza, że cała konwersja powinna zostać wykonana tuż przed wydrukowaniem, a nie rzeczywistymi znacznikami czasowymi.
Jak to zrobić, zależy jednak od tego, jak je teraz formatujesz. Wierzę, że PHP ma wbudowaną obsługę stref czasowych.