Подтвердить что ты не робот

PHP date(); с часовым поясом?

Итак, я проверил список поддерживаемых часовых поясов в PHP, и мне было интересно, как я могу включить их в date(); функционировать? Спасибо!

Мне не нужен часовой пояс по умолчанию, каждый пользователь имеет свой часовой пояс, хранящийся в базе данных, я беру этот часовой пояс пользователя и использую его. Как? Я знаю, как это сделать из базы данных, а не как ее использовать.

4b9b3361

Ответ 1

Для такой задачи вам действительно нужно использовать PHP DateTime class. Пожалуйста, проигнорируйте все ответы, предлагающие использовать дату() или date_set_time_zone, это просто плохо и устарело.

Я буду использовать псевдокод для демонстрации, поэтому попробуйте настроить код в соответствии с вашими потребностями.

Предполагая, что переменная $tz содержит строковое имя допустимого часового пояса, а переменная $timestamp содержит временную метку, которую вы хотите отформатировать в соответствии с часовым поясом, код будет выглядеть следующим образом:

$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');

Класс DateTime является мощным и для понимания всех его возможностей - вы должны посвятить часть своего времени чтению об этом на php.net. Чтобы полностью ответить на ваш вопрос - да, вы можете динамически настраивать параметр часового пояса (на каждой итерации при чтении с db вы можете создать новый объект DateTimeZone()).

Ответ 2

Если я понял правильно, вам нужно сначала установить часовой пояс:

date_default_timezone_set('UTC');

И чем вы можете использовать функцию даты:

// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');

Ответ 3

Используйте класс DateTime, поскольку он поддерживает часовые пояса. Эквивалент DateTime date() - DateTime::format.

Очень полезной оболочкой для DateTime является Carbon - определенно дайте ей взглянуть.

Вы хотите сохранить в базе данных как UTC и конвертировать на уровне приложения.

Ответ 4

Ему должно понравиться следующее:

date_default_timezone_set('America/New_York');

Ответ 5

Ответ выше заставил меня перепрыгнуть через некоторые обручи/ошибки, поэтому просто опубликовал более чистый код, который работал для меня:

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');

Ответ 6

Попробуйте это. Вы можете передать либо временную метку unix, либо строку datetime

public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s') 
    {
        $datetime = is_numeric($timestamp) ?
                    DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
                    new DateTime($timestamp, new DateTimeZone($fromTimezone));

        $datetime->setTimezone(new DateTimeZone($toTimezone));

        return $datetime->format($format);
    }

Ответ 7

Я создал эту очень простую функцию, и она работает как шарм:

function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */            
        $date = new DateTime(date("d F Y H:i:s",$timestamp));
        $date->setTimezone(new DateTimeZone($timezone));
        $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
        return $rt;
    }

Ответ 8

это прекрасно работает в 2019 году:

date('Y-m-d H:i:s',strtotime($date. ' '.$timezone)); 

Ответ 9

Вы можете заменить значение базы данных в функции date_default_timezone_set,   date_default_timezone_set (SOME_PHP_VARIABLE); но просто нужно позаботиться о точных значениях, относящихся к часовым поясам.