PHP time()是否返回GMT / UTC时间戳?


Does PHP time() return a GMT/UTC Timestamp?

我只想检查time()是否返回UTC / GMT时间戳或我是否需要使用date_default_timezone_set()


time返回UNIX时间戳,该时间戳与时区无关。由于UNIX时间戳表示自1970年UTC以来的秒数,您可以说它是UTC,但它确实没有时区。

要非常清楚,UNIX时间戳在任何给定时间都是全世界相同的值。在撰写时,它在东京,伦敦和纽约1296096875。要将此转换为"人类可读"时间,您需要指定要在哪个时区显示。1296096875在东京是2011-01-27 11:54:35,在伦敦它是2011-01-27 02:54:35,在纽约它是2011-01-26 21:54:35

实际上,在处理时间时,您通常会处理(混合)这些概念:

  • 绝对的时间点,我喜欢称之为人类历史的观点
  • 当地时间,我喜欢称之为挂钟时间
  • 以任何表示人类历史绝对点的格式的完整时间戳
  • 当地挂钟时间不完整

像这样可视化时间:

1
2
3
-------+-------------------+-------+--------+----------------+------>
       |                   |       |        |                |
Dinosaurs died        Jesus born  Y2K  Mars colonised       ???

(不按比例)

此行上的绝对点可表示为:

  • 1296096875
  • 2011年1月27日02:54:35欧洲/伦敦

两种格式在不同的符号中表示相同的绝对时间点。前者是一个简单的计数器,大致在这里开始:

1
2
3
4
5
                          start of UNIX epoch
                                  |
-------+-------------------+------++--------+----------------+------>
       |                   |       |        |                |
Dinosaurs died        Jesus born  Y2K  Mars colonised       ???

后者是一个更复杂但同样有效和富有表现力的反制者,大致在这里开始:

1
2
3
4
5
              start of Gregorian calendar
                           |
-------+-------------------+-------+--------+----------------+------>
       |                   |       |        |                |
Dinosaurs died        Jesus born  Y2K  Mars colonised       ???

UNIX时间戳很简单。它们是一个从一个特定时间点开始并且每秒增加1的计数器(官方定义的是第二个)。想象一下,伦敦有人在1970年1月1日午夜开始制作秒表,现在仍在运行。这或多或少是UNIX时间戳。每个人都使用相同的秒表值。

人类可读的挂钟时间更复杂,而且它的缩写和日常使用中省略了部分内容,因此更加复杂。 02:54:35在上图所示的时间轴上几乎没有任何意义。 2011年1月27日02:54:35已经具体化了很多,但仍然可能意味着这条线上的各种不同点。"当时钟在2011年1月27日02:54:35在伦敦敲响时,欧洲"现在终于在这条线上绝对明确,因为只有一个时间点才是真的。

因此,时区是"挂钟时间"的"修饰符",它是使用日历和小时/分钟/秒表示法表达唯一的绝对时间点所必需的。没有时区,这种格式的时间戳是模棱两可的,因为时钟在2011年1月27日02:54:35在全球各个国家的不同时间发生。

UNIX时间戳本身不存在此问题。

要从UNIX时间戳转换为人类可读的挂钟时间,您需要指定您希望显示时间的时区。要从挂钟时间转换为UNIX时间戳,您需要知道挂钟时间的哪个时区应该是。您要么必须每次都包含时区与每次这样的转换,要么设置与date_default_timezone_set一起使用的默认时区。


Since PHP 5.1.0 (when the date/time functions were rewritten), every
call to a date/time function will generate a E_NOTICE if the timezone
isn't valid, and/or a E_WARNING message if using the system settings
or the TZ environment variable.

因此,为了获得UTC时间戳,您应该检查当前时区是什么,然后使用它还是只使用:

1
2
$utc_str = gmdate("M d Y H:i:s", time());
$utc = strtotime($utc_str);


http://us3.php.net/time

"返回自Unix Epoch(1970年1月1日00:00:00 GMT)以来秒数测量的当前时间。"

所以我相信你的问题的答案是肯定的。


从文档中

Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).


其中一条评论声称:"time()和strtotime(gmdate("M d Y H:i:s",time()))返回相同的结果"

由于我不确定,我进行了测试:

1
2
3
$now = strtotime(gmdate("Y-m-d H:i:s", time()));
$now2 = time();
echo ' now='.$now.' now2='.$now2.' diff='.($now - $now2);

产出是:

1
 now=1536824036 now2=1536806036 diff=18000

Diff是18000秒= 5小时=运行测试的服务器的时区偏移量。