关于datetime:用PHP获取UTC时间

get UTC time in PHP

如何使用php的date()函数获取UTC/GMT+/-时间戳?例如,如果我尝试

1
date("Y-m-d H:i:s", time());

我将得到Unix时间戳;但是我需要得到基于本地时间的字符串gmt/utc+/-0400或gmt/utc+/-1000的UTC/gmt时间戳。


使用gmdate将始终返回一个GMT日期。语法与date相同。


一个简单的gmdate()就足够了

1
2
<?php
print gmdate("Y-m-d\TH:i:s\Z");


如前所述,由于php 5.2.0,您可以使用DateTime类并使用DateTimeZone的实例指定UTC时区。

datetime uuconstruct()文档建议在创建datetime实例并指定时区以获取当前时间时,将"now"作为第一个参数传递。

1
2
3
$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC


1
2
3
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);


1
date("Y-m-d H:i:s", time() - date("Z"))

除了调用gmdate之外,您还可以将此代码置于其余代码之前:

1
2
3
<?php
date_default_timezone_set("UTC");
?>

这将使您的其余日期/时间相关呼叫使用GMT/UTC时区。


获取UTC日期

1
gmdate("Y-m-d H:i:s");

获取UTC时间戳

1
time();

即使代码上有date_default_timezone_set,结果也不会不同。


可以使用不带参数的gmmktime函数获取当前的UTC时间戳:

1
2
$time = gmmktime();
echo date("Y-m-d H:i:s", $time);

只有当服务器时间使用UTC时,gmmktime才能工作。例如,我的服务器设置为US/Pacific。上面列出的函数是回太平洋时间。


with string GMT/UTC +/-0400 or GMT/UTC +/-1000 based on local timings

您的自定义格式只是缺少O以提供与本地时间的时区偏移量。

Difference to Greenwich time (GMT) in hours Example: +0200

1
2
date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

2018-01-12 12:10:11 -0400

但是,为了最大限度地提高可移植性/互操作性,我建议使用ISO8601日期格式c

1
2
date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12:10:11-04:00

1
2
date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02:10:11+10:00

您也可以使用gmdate,时区偏移字符串将始终是+00:00

1
2
date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16:10:11+00:00

1
2
date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16:10:11+00:00


您可以使用以下命令获取UTC时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */

    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }