时区转换在PHP中

任何人都可以提出一个简单的方法来转换date和时间在不同的时区在PHP?

你可以使用这个datetime对象或者它们的函数别名:

示例( 从PHP手册摘录

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

编辑关于评论

但我不能使用这种方法,因为我需要在不同的时区显示date作为用户从不同的位置login

这不是问题。 当用户login时,您可以确定他的时区,并将其设置为您的DateTime对象,如图所示。 我在我的一个项目中使用类似的方法,它的作用就像一个魅力。

在数据库中我需要在任何单个时区获取date,那么只有它可以正确处理

您可以将时间作为时间戳或date时间存储在一个时区中。 查询DateTime字段时,可以将DateTime对象中的时间转换为此时区,或者 – 如果您的数据库支持它,则使用所选时区查询。

一个更简单的方法是这样的:

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

正如在PHP手册中所描述的 ,strtotime()也接受一个时区,你只需要把它附加到你的date时间。

我build议您将所有date时间存储在UTC中,因为这样您不会遇到夏时制问题。

这工作对我来说,它也很干净!

 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); 

DateTime :: setTimezone – date_timezone_set – 设置DateTime对象的时区

面向对象的风格

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

程序风格

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

上面的例子会输出:

 2000-01-01 00:00:00+12:00 2000-01-01 01:45:00+13:45 

这些答案都没有为我工作(我跳过了尝试过于庞大的代码)。 我也觉得改变默认的时区只是一个单一的转换是奇怪的。

这是我的解决scheme:

 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("Ymd H:i:s"); } 

所以,要转换为服务器默认值,您只需传递一个时区:

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

要从服务器默认转换为用户,您将保留第二个参数为空或空白:

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

要切换到与默认值无关的时区,您需要提供2个时区:

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

UTC到本地:

 <?php $datetime = date("Ymd H:i:s"); $utc = new DateTime($datetime, new DateTimeZone('UTC')); $utc->setTimezone(new DateTimeZone('America/Sao_Paulo')); echo $utc->format('Ymd H:i:s'); ?> 
 <?php $time='6:02'; $dt = new DateTime($time, new DateTimeZone('America/New_York')); //echo $dt->format('Ymd H:i:s') . PHP_EOL; $dt->setTimezone(new DateTimeZone('Asia/Kolkata')); echo $dt->format('H:i') . PHP_EOL; ?> 

//将date从一个区域转换为另一个区域.. / * $ zone_from ='Asia / Kolkata';

 $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("Ymd H:i:s"); date_default_timezone_set($cur_zone); $local = date("Ymd H:i:s"); date_default_timezone_set($req_zone); $required = date("Ymd 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("Ymd H:i:s"); }