繁体   English   中英

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 ,东京、伦敦和纽约的12960968751296096875 要将其转换为“人类可读”的时间,您需要指定要在哪个时区显示它。 1296096875在东京是2011-01-27 11:54:35 ,在伦敦是2011-01-27 02:54:35而在纽约是2011-01-26 21:54:35

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

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

像这样可视化时间:

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

(不按比例)

这条线上的绝对点可以表示为:

  • 1296096875
  • 2011 年 1 月 27 日 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在上图的时间线上几乎没有任何意义。 Jan. 27 2011 02:54:35已经更具体了,但仍然可能意味着这条线上的各种不同点。 “当时钟于 2011 年 1 月 27 日在伦敦敲响 02:54:35 时,欧洲现在终于成为这条线上的一个明确的绝对点,因为只有一个时间点是正确的。

因此,时区是“挂钟时间”的“修饰符”,它是使用日历和小时/分钟/秒表示法表达独特的绝对时间点所必需的。 如果没有时区,这种格式的时间戳是不明确的,因为时钟在 2011 年 1 月 27 日的 02:54:35 敲响了全球每个国家/地区的不同时间。

UNIX 时间戳本质上没有这个问题。


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

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

因此,为了获得 UTC 时间戳,您应该检查当前时区是什么并解决它仅使用:

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

http://us3.php.net/time

“返回自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来以秒为单位测量的当前时间。”

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

文档

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

其中一条评论声称:“time() 和 strtotime(gmdate("M d YH: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 小时 = 运行测试的服务器的时区偏移。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM