2017-01-18 3 views
0

Скажите, что у меня есть переменная часового пояса, которая возвращается из базы данных, которую мои пользователи могут установить в свой предпочтительный часовой пояс. GMT + 5 вернется просто:Как вернуть временную метку на основе пользовательского часового пояса?

$timezone = 5; 

мне нужен часовой пояс пользователей, так что я могу отразить дату события в их конкретном формате времени. Вот то, что я до сих пор:

while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) { 
$time = strftime("%Y-%m-%d %I:%M %p", strtotime($row["time"])); 
} 
echo $time; 

Как я мог изменить выше выход, чтобы отразить время события на основе пользователей предпочтительного часового пояса?

//Output = 2017-01-15 12:09 AM 
//Expected Output: 2017-01-14 07:09 PM 
+0

Вы должны определенно не использовать целое число для хранения часового пояса. Используйте идентификатор часового пояса, например: «Европа/Париж». –

+0

Что делать, если я иду по Гринвичу? – Dylan

ответ

2

Используйте DateTime и DateTimeZone объектов.

<?php 

$storedDate = new DateTime('2017-01-15 12:09 AM'); 
$userDate = (clone $storedDate)->setTimeZone(new DateTimeZone('Europe/Paris')); 

printf(
    "Stored Date:\t%s\nUser Date:\t%s\n", 
    $storedDate->format(DATE_ATOM), 
    $userDate->format(DATE_ATOM) 
); 

// outputs: 
// Stored Date: 2017-01-15T00:09:00+00:00                    
// User Date:  2017-01-15T01:09:00+01:00 

Как сказано в моем комментарии, я не рекомендую хранить часовой пояс как целое число.

Во-первых, поскольку некоторый часовой пояс не может соответствовать целому числу, например, Индия до 5:30 (+0530) со времени UTC.

Хранение как целого также не поможет вам правильно обрабатывать летнее время в некоторых странах или даже в каком-либо регионе в одной стране (см. Бразилию).

Смещение временной зоны может быть изменено, но определенная конфигурация для заданного местоположения, такая как Europe/Paris, скорее всего, не будет.

+0

Не могли бы вы предоставить решение для работы с ним по GMT (именно поэтому я использовал целые числа) – Dylan

+0

Используя класс 'DateTimeZone', вы можете использовать любой из часовых поясов IANA (' Европа/Париж') или UTC Offset, например 'GMT + 1'. Однако, опять-таки, сохранение часового пояса как целого - плохая идея, я отредактирую свой ответ соответствующим образом. –