在UTC中将UTC转换为不同的时区

时间:2013-09-29 04:53:01

标签: php timezone

我正在使用以下方法将UTC时间转换为其他时区。但是下面的方法似乎返回了UTC时间。你们中的任何一个人都会在我使用的方法中指出什么是错误的吗?

static function formatDateMerchantTimeZone($t, $tz) {
   if (isset($t)) {
       return date('Y-m-d H:i:s', strtotime($t , $tz));
   } else {
       return null;
   }
}  

$ t是我通过的日期时间 $ tz是时区,例如America / Los_Angeles

4 个答案:

答案 0 :(得分:2)

让我感到惊讶的是,很多人都没有意识到或没有使用DateTime课程。他们使这样的任务几乎是微不足道的。

我假设您传递给该函数的日期字符串是UTC时区。

function formatDateMerchantTimeZone($t, $tz)
{
    $date = new \DateTime($t, new \DateTimeZone('UTC'));
    $date->setTimezone(new \DateTimeZone($tz));
    return $date->format('Y-m-d H:i:s');
}

See it working

答案 1 :(得分:1)

Strtotime将字符串格式的时间戳转换为有效的日期时间,如'09 -29-2013 07:00:00'作为第二个参数,它不会将时区转换为时间。 php有许多时区功能,例如timezone_offset,可以计算两个时区之间的差异。请查看文档以获取更多信息:

http://php.net/manual/en/function.timezone-offset-get.php

答案 2 :(得分:0)

 static function formatDateMerchantTimeZone($t, $tz) {
    if (isset($t)) {
        date_default_timezone_set($tz);
        return date('Y-m-d H:i:s', strtotime($t));
    } else {
        return null;
    }
}

来自php.net第一条评论。

为避免令人沮丧的困惑,我建议您随时致电 使用strtotime()之前的date_default_timezone_set('UTC')。

因为UNIX Epoch始终是UTC;如果你不这样做,你很可能输出错误的时间。

答案 3 :(得分:0)

试试这个:

    <?php
/**    Returns the offset from the origin timezone to the remote timezone, in seconds.
*    @param $remote_tz;
*    @param $origin_tz; If null the servers current timezone is used as the origin.
*    @return int;
*/
function get_timezone_offset($remote_tz, $origin_tz = null) {
    if($origin_tz === null) {
        if(!is_string($origin_tz = date_default_timezone_get())) {
            return false; // A UTC timestamp was returned -- bail out!
        }
    }
    $origin_dtz = new DateTimeZone($origin_tz);
    $remote_dtz = new DateTimeZone($remote_tz);
    $origin_dt = new DateTime("now", $origin_dtz);
    $remote_dt = new DateTime("now", $remote_dtz);
    $offset = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
    return $offset;
}
?>
Examples:
<?php
// This will return 10800 (3 hours) ...
$offset = get_timezone_offset('America/Los_Angeles','America/New_York');
// or, if your server time is already set to 'America/New_York'...
$offset = get_timezone_offset('America/Los_Angeles');
// You can then take $offset and adjust your timestamp.
$offset_time = time() + $offset;
?>