【问题标题】:Converting from UTC to any timezone从 UTC 转换为任何时区
【发布时间】:2018-09-03 03:22:45
【问题描述】:

我的 linux 机器设置为使用 UTC。给定一个时区和日期,我想获取日期范围,以便我可以查询数据库以获取在任何给定日期创建的记录。例如,如果现在是美国/丹佛时区的 2018 年 3 月 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,这是不正确的。有什么指点吗?

【问题讨论】:

标签: php datetime


【解决方案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);
}

【讨论】:

  • 像魅力一样工作。谢谢!
  • 我相信函数名应该叫做 LocalTimeToUTC。如果我通过当地时间(2018-03-24 00:00:00)它会返回 UTC 时间,对吗? 2018-03-23 18:00:00
  • 我需要获取任何给定日期的日期时间范围。如果今天是美国/丹佛时间的 2018 年 3 月 24 日,我需要 UTC 时间,以便我可以在数据库中查询此日期记录。在 UTC 中,这需要从 2018-03-23 18:00:00 到 2018-03-24 17:59:59。
  • 我已经编辑了我的答案并使用了本地到 utc 函数
  • 如果我将 2018-03-24 00:00:00 传递给您的新函数,它会返回 2018-03-24 06:00:00 第一个函数实际上给了我正确的 UTC 时间2018-03-23 18:00:00
【解决方案2】:

您使用伪造的本地时间向 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2011-09-16
    • 2023-03-10
    • 2022-01-24
    • 2012-11-17
    • 2016-10-16
    • 2016-10-10
    相关资源
    最近更新 更多