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

时间:2011-01-27 02:40:26

标签: php

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

5 个答案:

答案 0 :(得分:94)

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


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

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

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

可视化时间:

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

(不按比例)

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

  • 1296096875
  • 一月27 2011 02:54:35欧洲/伦敦

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

                          start of UNIX epoch
                                  |
-------+-------------------+------++--------+----------------+------>
       |                   |       |        |                |
Dinosaurs died        Jesus born  Y2K  Mars colonised       ???

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

              start of Gregorian calendar
                           |
-------+-------------------+-------+--------+----------------+------>
       |                   |       |        |                |
Dinosaurs died        Jesus born  Y2K  Mars colonised       ???

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

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

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

UNIX时间戳本身没有此问题。


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

答案 1 :(得分:15)

  

从PHP 5.1.0开始(当日期/时间函数被重写时),每一个   如果时区调用日期/时间函数将生成E_NOTICE   如果使用系统设置,则无效,和/或E_WARNING消息   或TZ环境变量。

因此,为了获得UTC时间戳,您应该检查当前时区是什么,然后使用进行操作:

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

答案 2 :(得分:4)

http://us3.php.net/time

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

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

答案 3 :(得分:2)

来自the documentation

  

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

答案 4 :(得分:0)

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

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

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

输出为:

 now=1536824036 now2=1536806036 diff=18000

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