在PHP中将时间和date从一个时区转换为另一个时区

基本上我需要的是一个脚本,当提供一个时间和一个时区可以在另一个时区返回时间。

我的主要问题是:

  • 在哪里得到从格林尼治标准时间偏移 – 是否有一个公共数据库可用于此?
  • 如何也考虑到夏令时(DST)的差异。
  • 如何很好地将其包装在一个PHP类中 – 还是有这样一个类已经可用?
<?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"; ?> 

上面的例子会输出:

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

在php.net上的DateTime手册上find

编辑:像Pekka说:DateTime类存在从5.2开始,那么你首先必须找出哪些方法是真正实现的,哪一个只存在于5.3以上。

试试这个,这可能有助于:)

 function converToTz($time="",$toTz='',$fromTz='') { // timezone by php friendly values $date = new DateTime($time, new DateTimeZone($fromTz)); $date->setTimezone(new DateTimeZone($toTz)); $time= $date->format('Ymd H:i:s'); return $time; } 

在这里我使用这个函数将datetime转换为另一个时区。 为了最好的结果,如果你把你的date时间转换为utc时区,然后转换成所需的时区,那么它是更好的结果。

 function ConvertTimezoneToAnotherTimezone($time, $currentTimezone, $timezoneRequired) { $dayLightFlag = false; $dayLgtSecCurrent = $dayLgtSecReq = 0; $system_timezone = date_default_timezone_get(); $local_timezone = $currentTimezone; date_default_timezone_set($local_timezone); $local = date("Ymd H:i:s"); /* Uncomment if daylight is required */ // $daylight_flag = date("I", strtotime($time)); // if ($daylight_flag == 1) { // $dayLightFlag = true; // $dayLgtSecCurrent = -3600; // } date_default_timezone_set("GMT"); $gmt = date("Ymd H:i:s "); $require_timezone = $timezoneRequired; date_default_timezone_set($require_timezone); $required = date("Ymd H:i:s "); /* Uncomment if daylight is required */ // $daylight_flag = date("I", strtotime($time)); // if ($daylight_flag == 1) { // $dayLightFlag = true; // $dayLgtSecReq = +3600; // } date_default_timezone_set($system_timezone); $diff1 = (strtotime($gmt) - strtotime($local)); $diff2 = (strtotime($required) - strtotime($gmt)); $date = new DateTime($time); $date->modify("+$diff1 seconds"); $date->modify("+$diff2 seconds"); if ($dayLightFlag) { $final_diff = $dayLgtSecCurrent + $dayLgtSecReq; $date->modify("$final_diff seconds"); } $timestamp = $date->format("Ymd H:i:s "); return $timestamp; } 

谢谢。