在PHP中获取UTC时间


122

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

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

我将获得Unix时间戳;但我需要根据当地时间获取字符串为GMT / UTC +/- 0400或GMT / UTC +/- 1000的UTC / GMT时间戳。


1
@JeffPuckettII GMT不会更改夏令时。英国在夏季从GMT更改为BST,但GMT保持不变并且始终与UTC匹配。
刘易斯

Answers:


111

使用gmdate将始终返回格林尼治标准时间。语法与相同date


12
@sanmai:根据定义,Unix时间戳始终为UTC。en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org:问题是gmdate(“ U”)返回的时间与time()相同,如果您的服务器系统时区不同,则返回的时间不是UTC时间戳。我能获得基于真实UTC时间戳的唯一方法是strtotime(gmdate(“ M d YH:i:s”)),当您的服务器系统时区与UTC不同时,它与gmdate(“ U”)不同
bksi

@bksi我无法重复您描述的行为。(我的机器不在GMT上,并且我的UNIX时间戳正确。也是gmdate("U") == time()。)听起来像是潜在的错误行为。仔细检查并向PHP项目提交错误。
nikc.org

我使用简单的php脚本来测试场景:<?echo time()。“ ===” .strtotime(gmdate(“ M d YH:i:s”))。“时区:” .date(“ Z”)。“ \ n”; 当我运行它时,我得到以下结果:1456342082 === 1456338482时区:3600 shell命令日期的结果是:2016
bksi

1
@bksi-也许您将datetime的内部表示与datetime的外部表示混淆了?w / oa区域说明符vs时间与区域说明符?正如nikc(和文档)所说,time()返回“自Unix纪元(1970年1月1日00:00:00 GMT)以来的秒数”。注意GMT。默认情况下,系统会将其转换为您的时区以便显示,这一事实是用户的方便。在内部,它始终是格林尼治标准时间。
ToolmakerSteve19年


47

先前的回答,从PHP 5.2.0开始,您可以使用DateTime类并使用实例指定UTC时区DateTimeZone

DateTime __construct()文档建议在创建DateTime实例并指定时区以获取当前时间时传递“ now”作为第一个参数。

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

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

3
DateTime __construct()文档不再建议省略第一个参数来获取当前时间。现在它说您应该使用字符串“ now”。
PaulSkinner '18年

谢谢@PaulSkinner,我已经修改了答案。
Jessedc

谢谢,反斜杠之前的目的是DateTime什么?自己运行它,如果没有它们,它似乎可以正常运行。
下雪时间

1
@Snow如果将此代码插入命名空间代码中,则假设您的文件namespace A在顶部具有声明,PHP将假定DateTime引用A\DateTime,这是错误的。添加反斜杠可解决此问题。我认为,即使您还没有使用名称空间,这也是一个好习惯。
Niavlys

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

3
@AlainTiemblo不完全;您需要减去偏移量以使其起作用
sanmai 2013年


14

获取UTC日期

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

获取UTC时间戳

time();

即使您使用date_default_timezone_set的代码也不会有不同的结果。


@زياد感谢您的更正,我修改了答案
StefansArya '19

我以为gmdate()返回GMT而不是UTC。“与date()函数相同,但返回的时间为格林威治标准时间(GMT)”。我想念什么吗?这些等同吗?
约旦

3
@Jordan实际上,UTC和GMT表示相同的时间。stackoverflow.com/questions/48942916/…–
martti

12

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

<?php
date_default_timezone_set("UTC");
?>

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


在最新版本的PHP中不再可用。
霍姆纳兹

1
@KhomNazid“ UTC”作为参数仍然有效。php.net/manual/en/…–
Harikrishna

6

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

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

gmmktime仅在服务器时间使用UTC时才有效。例如,我的服务器设置为US / Pacific。上面列出的功能回显太平洋时间。


gmmktime()已弃用
Jonny

2

根据本地时间使用字符串GMT / UTC +/- 0400或GMT / UTC +/- 1000

您缺少自定义格式,O无法为您提供时区与本地时间的偏移量。

与格林威治时间(GMT)的时差,以小时为单位例如:+0200

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

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

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

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

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

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

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

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

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

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


1

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

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

0
/**
     * 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)
        );
    }

0

在下面找到PHP代码以获取当前UTC(世界标准时间)时间

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.