从UTC转换为任何时区

时间:2018-03-24 15:56:06

标签: php datetime

我的linux框设置为使用UTC。给定时区和日期,我想得到日期范围,以便我可以在数据库中查询在任何给定日期创建的记录。例如,如果它现在是2018-03-24美国/丹佛时区上午9点。我想以UTC格式获取此日期的开始和结束时间。如何获得该日期开始时的UTC等效值?

<?php
$date = new DateTime(date('Y-m-d H:i:s'), new     DateTimeZone('America/Denver'));
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d 00:00:00');
?>

这将返回2018-03-24 00:00:00,这是不正确的。有什么指针吗?

2 个答案:

答案 0 :(得分:1)

尝试使用此功能。

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



function LocalTimeToUTCTime($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($tz));
    $local_datetime = $utc_datetime;
    $local_datetime->setTimeZone(new DateTimeZone('UTC'));
    return $local_datetime->format($ToDateFormat);
}

答案 1 :(得分:0)

您使用虚假当地时间向DateTime构造函数提供信息:

new DateTime(date('Y-m-d H:i:s'), newDateTimeZone('America/Denver'));
             ^^^^

你告诉PHP这是丹佛当地时间,但你真的不知道。由于字符串不包含时区信息,PHP将使用default time zone

只需删除date()即可。它没有任何意义,只会让事情变得更难。

<?php
$date = new DateTime('now', new DateTimeZone('America/Denver'));
echo $date->format('r'), PHP_EOL;
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('r'), PHP_EOL;
Sun, 25 Mar 2018 06:11:21 -0600
Sun, 25 Mar 2018 12:11:21 +0000