PHP UTC到本地时间

mhd8tkvw  于 2023-02-07  发布在  PHP
关注(0)|答案(6)|浏览(167)
    • 服务器环境**

企业Linux
PHP语言5.3.5

    • 问题**

假设我有一个UTC日期和时间,例如2011 - 04 - 27 02:45,我想将其转换为我的本地时间,即America/New_York。

    • 三个问题:**

1.)我下面的代码可以解决这个问题,你同意吗?

<?php

date_default_timezone_set('America/New_York');  // Set timezone.

$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

// Timezone offset in seconds. The offset for timezones west of UTC is always negative,
// and for those east of UTC is always positive.
$offset = date("Z");

$local_ts = $utc_ts + $offset;  // Local Unix timestamp. Add because $offset is negative.

$local_time = date("Y-m-d g:i A", $local_ts);  // Local time as yyyy-mm-dd h:m am/pm.

echo $local_time;  // 2011-04-26 10:45 PM

?>

2.)但是,$offset的值是否会根据夏令时(DST)自动调整?
3.)如果没有,我应该如何调整我的代码来自动调整DST?
谢谢你:-)

yzuktlbb

yzuktlbb1#

这将使用PHP原生DateTimeDateTimeZone类完成您想要的任务:

$utc_date = DateTime::createFromFormat(
                'Y-m-d G:i', 
                '2011-04-27 02:45', 
                new DateTimeZone('UTC')
);

$nyc_date = $utc_date;
$nyc_date->setTimeZone(new DateTimeZone('America/New_York'));

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM

有关详细信息,请参见DateTime::createFromFormat man page
time zones that do and do not currently have DST之间进行了一些实验之后,我发现这将考虑DST。使用我上面的方法进行相同的转换会呈现相同的结果时间。

p1iqtdky

p1iqtdky2#

我知道这是一个老职位,但有另一行你需要添加,以获得正确的时间。
在转换为本地时间之前,您需要将默认时区设置为UTC,如下所示(如果它是您提供的时间所在的时区):

function GmtTimeToLocalTime($time) {
    date_default_timezone_set('UTC');
    $new_date = new DateTime($time);
    $new_date->setTimeZone(new DateTimeZone('America/New_York'));
    return $new_date->format("Y-m-d h:i:s");
}
jpfvwuh4

jpfvwuh43#

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

在执行这个命令之后,$utc_ts包含本地时间,PHP自己处理DST。
=H=

svujldwt

svujldwt4#

我会改进哈辛·海德尔的回答

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45 UTC");  // UTC Unix timestamp.
echo date('Y-m-d H:i:s a T', $utc_ts);

它应该输出

2011-04-26 10:45:00 pm EDT

不同之处在于添加了源时区。strtetime()也接受时区!:p

bd1hkmkf

bd1hkmkf5#

<?php
    $time = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
    $timeZone = $time->format('P');//Asia/Kolkata ... GET TimeZone From PHP ini Setting
    $tm_datetime = '08/08/2021 12:00 AM';
    $tm_tz_from = $timeZone;
    $tm_tz_to = 'UTC';
    $tm_format = 'Ymd\THis\Z';
    $dt = new DateTime($tm_datetime, new DateTimeZone($tm_tz_from));
    $dt->setTimeZone(new DateTimeZone($tm_tz_to));
    $utc_time_from =$dt->format("H:i:s");
    echo "UTC TIME".$utc_time_from;

?>
cigdeys3

cigdeys36#

我不喜欢改变默认时区的答案。根据我在夏季时间变化的国家生活的经验,正确的方法是总是在UTC工作,然后在向用户显示时,改为本地时间。
这是我使用的一个,从一个时区到另一个时区(在本例中从UTC到欧洲/马德里)。

$newDateTime = new DateTime($sourcetime, new DateTimeZone("UTC")); 
$newDateTime->setTimezone(new DateTimeZone("Europe/Madrid")); 
echo $newDateTime->format("Y-m-d H:i:s")." ";

如果您需要日期之间的操作秒数,则使用$newDateTime-〉getTimestamp(),例如:

$difftime=time()-$newDateTime->getTimestamp();

相关问题