В настоящее время я храню время, используя функцию «time ()» в базе данных. Тем не менее, он использует часовой пояс сервера, и я хотел бы, чтобы каждый пользователь видел время в соответствии с их часовым поясом (установленным в их профиле).
Как сделать преобразование временной метки? (и я имею в виду от отметки времени до отметки времени, а не для чтения)
Как сказал Джонас, отметки времени UNIX по определению UTC, но вы могли бы взломать что-то подобное вместе, чтобы имитировать временные метки, зависящие от времени, если вам действительно нужно:
// 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;
Действительно, вы не должны взламывать сами метки времени, чтобы изменить дату внутри, вы должны просто применять часовой пояс к метке времени, прежде чем представлять отформатированную датуку пользователю.
Это модифицированная версия кода Майка, которая должна работать для PHP 5> = 5.2.0, как на 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;
Временные метки UNIX по определению указаны в формате UTC, что означает, что все преобразования должны выполняться непосредственно перед печатью, а не с фактическими отметками времени.
Как это сделать, однако, зависит от того, как вы их форматируете в настоящее время. Я считаю, что PHP имеет встроенную обработку часового пояса.