-1

我正在使用以下方法将 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

4 回答 4

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

看到它工作

于 2013-09-29T06:16:40.540 回答
1

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

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

于 2013-09-29T04:59:46.273 回答
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 纪元始终是 UTC;如果您不这样做,您很可能会输出错误的时间。

于 2013-09-29T05:00:44.390 回答
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;
?>
于 2013-09-29T05:06:45.900 回答