/ / PHP: Jak przekonwertować sygnaturę czasową serwera na strefę czasową użytkownika? - php, strefa czasowa, znacznik czasu

PHP: Jak przekonwertować sygnaturę czasową serwera na strefę czasową użytkownika? - php, strefa czasowa, znacznik czasu

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 № 1

Jak 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.