2010-03-24 7 views

ответ

85

Вы можете использовать объект DATETIME или их синонимов функций этого:

Example (abridged from PHP Manual)

date_default_timezone_set('Europe/London'); 

$datetime = new DateTime('2008-08-03 12:35:23'); 
echo $datetime->format('Y-m-d H:i:s') . "\n"; 
$la_time = new DateTimeZone('America/Los_Angeles'); 
$datetime->setTimezone($la_time); 
echo $datetime->format('Y-m-d H:i:s'); 

Редактировать относительно комментарии

но я cannt использовать этот метод, потому что мне нужно показать дату в разных часовых поясах, так как мы er логин из разных мест

Это не проблема. Когда пользователь входит в систему, вы определяете его часовой пояс и устанавливаете его в свой объект DateTime, как показано на рисунке. Я использую подобный подход в одном из моих проектов, и он работает как шарм.

в базе данных мне нужно, чтобы получить даты в какой-либо одной временной зоне, то только он может быть обработан правильно

Вы сохраняете время либо в качестве метки времени или даты-времени в одном часовом поясе. Когда вы запрашиваете поле DateTime, вы либо конвертируете время в объект DateTime в этот часовой пояс, либо - если ваш db поддерживает его - запрос с выбранным часовым поясом.

+0

спасибо Гордон, но я cannt использовать этот метод, потому что мне нужно, чтобы показать дату в разных часовых поясах, как логин пользователя из разных мест – raki

+0

@raki: так просто после того, как пользователь входит в систему - настройте date_default_timezone_set() с соответствующим часовым поясом пользователя. – zerkms

+0

что тоже не возможно .. потому что .. в базе данных мне нужно получить дату в какой-либо одной временной зоне, то только он может быть правильно обработан – raki

9

Еще более простой метод выглядит следующим образом:

date_default_timezone_set('Europe/London'); // your user's timezone 
$my_datetime='2013-10-23 15:47:10'; 
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC")); 

Как описано in the PHP manual, StrToTime() принимает часовой пояс тоже, вы просто должны добавить его в DateTime.

Я рекомендую вам хранить все ваши даты в UTC, потому что таким образом у вас не будет проблем с летней экономией.

9

Это сработало для меня, и это тоже очень чисто!

function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($userTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($serverTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

//example usage 
$serverDate = $userDate = '2014-09-04 22:37:22'; 
echo convert_to_user_date($serverDate); 
echo convert_to_server_date($userDate); 
4

DateTime::setTimezone -- date_timezone_set — Sets the time zone for the DateTime object

Объект ориентированный стиль

<?php 
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

$date->setTimezone(new DateTimeZone('Pacific/Chatham')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 

Процедурный стиль

<?php 
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 

date_timezone_set($date, timezone_open('Pacific/Chatham')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 
?> 

Приведенные выше примеры выведет:

2000-01-01 00:00:00+12:00 
2000-01-01 01:45:00+13:45 
0
<?php 
$time='6:02'; 
$dt = new DateTime($time, new DateTimeZone('America/New_York')); 
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL; 
$dt->setTimezone(new DateTimeZone('Asia/Kolkata')); 
echo $dt->format('H:i') . PHP_EOL; 
?> 
0

// Преобразование даты из одной зоны в другую .. /* $ zone_from = 'Азия/Калькутта';

$zone_to='America/Phoenix'; 

date_default_timezone_set($zone_from); 

$convert_date="2016-02-26 10:35:00"; 

echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); 

*/ 
function zone_conversion_date($time, $cur_zone, $req_zone) 
{ 
    date_default_timezone_set("GMT"); 
    $gmt = date("Y-m-d H:i:s"); 

    date_default_timezone_set($cur_zone); 
    $local = date("Y-m-d H:i:s"); 

    date_default_timezone_set($req_zone); 
    $required = date("Y-m-d H:i:s"); 

    /* return $required; */ 
    $diff1 = (strtotime($gmt) - strtotime($local)); 
    $diff2 = (strtotime($required) - strtotime($gmt)); 

    $date = new DateTime($time); 
    $date->modify("+$diff1 seconds"); 
    $date->modify("+$diff2 seconds"); 

    return $timestamp = $date->format("Y-m-d H:i:s"); 
} 
1

UTC в местное:

<?php 
$datetime = date("Y-m-d H:i:s"); 
$utc = new DateTime($datetime, new DateTimeZone('UTC')); 
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo')); 
echo $utc->format('Y-m-d H:i:s'); 

?> 
4

Ни один из этих ответов не работал для меня (я пропустил пытаясь код, который был слишком громоздким в размерах). Я также думаю, что странно менять часовой пояс по умолчанию только для одного преобразования.

Вот мое решение:

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null) 
{ 
    if (empty($timeZoneSource)) { 
    $timeZoneSource = date_default_timezone_get(); 
    } 
    if (empty($timeZoneTarget)) { 
    $timeZoneTarget = date_default_timezone_get(); 
    } 

    $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource)); 
    $dt->setTimezone(new DateTimeZone($timeZoneTarget)); 

    return $dt->format("Y-m-d H:i:s"); 
} 

Таким образом, для преобразования сервера по умолчанию, вы бы просто пройти один часовой пояс:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo"); 

Для преобразования с сервера по умолчанию для пользователя, вы оставит 2-й параметр пустым или незаполненным:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo"); 

И переключиться на временные интервалы unre веден по умолчанию, необходимо предоставить 2 часовых поясов:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo"); 
+0

Кажется, отлично работает! –

+1

Хороший ответ. Я предпочитаю try catch вместо is (empty), чтобы избежать ошибок орфографии в строке часового пояса. try { новый DateTimeZone ($ timeZoneSource); } \t улов (Исключение $ е) { $ timeZoneSource = date_default_timezone_get(); } –

Смежные вопросы