时区-在PHP中将时间和日期从一个时区转换为另一个时区

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

我的主要问题是:

  • 从哪里获取GMT的时间偏差-是否有可用的公共数据库?
  • 如何也考虑夏时制(DST)的差异。
  • 如何将它们很好地包装在一个PHP类中?或者是否已有这样的类?
titel asked 2020-08-11T16:29:20Z
4个解决方案
87 votes
<?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";
?>

上面的示例将输出:

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

在php.net的DateTime手册上找到

编辑:就像Pekka所说的:DateTime类从5.2开始存在,您首先必须找出真正实现了哪些方法,而从5.3开始仅存在那些方法。

ITroubs answered 2020-08-11T16:29:35Z
8 votes

试试这个,可能会有所帮助:)

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('Y-m-d H:i:s');
        return $time;
    }

有点描述:该函数需要3个输入,即转换时间,转换时区,当前时区,并以指定格式返回输出。

Shubham Mathur answered 2020-08-11T16:29:59Z
2 votes

我知道晚了 对于任何想要简单函数将utc转换为任何本地时区的人

function UTCTimeToLocalTime($time, $tz = '', $FromDateFormat = 'Y-m-d H:i:s', $ToDateFormat = 'Y-m-d H:i:s')
{
if ($tz == '')
    $tz = date_default_timezone_get();

$utc_datetime = DateTime::createFromFormat($FromDateFormat, $time, new
    DateTimeZone('UTC'));
$local_datetime = $utc_datetime;

$local_datetime->setTimeZone(new DateTimeZone($tz));
return $local_datetime->format($ToDateFormat);
}

 echo UTCTimeToLocalTime('2015-07-01 13:30:00','America/Denver');
srp answered 2020-08-11T16:30:21Z
-1 votes

在这里,我使用此功能将日期时间转换为另一个时区。为了获得最佳结果,如果将日期时间转换为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("Y-m-d 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("Y-m-d H:i:s ");

    $require_timezone = $timezoneRequired;
    date_default_timezone_set($require_timezone);
    $required = date("Y-m-d 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("Y-m-d H:i:s ");

    return $timestamp;
}

谢谢。

user2622929 answered 2020-08-11T16:30:46Z
translate from https://stackoverflow.com:/questions/3905193/convert-time-and-date-from-one-time-zone-to-another-in-php