[英]Does PHP time() return a GMT/UTC Timestamp?
我只想检查time()
返回 UTC/GMT 时间戳,还是需要使用date_default_timezone_set()
?
time
返回一个 UNIX 时间戳,它与时区无关。 由于 UNIX 时间戳表示自 1970 UTC以来的秒数,您可以说它是 UTC,但它确实没有时区。
确切地说,UNIX 时间戳在任何给定时间在全世界都是相同的值。 在撰写1296096875
,东京、伦敦和纽约的1296096875
是1296096875
。 要将其转换为“人类可读”的时间,您需要指定要在哪个时区显示它。 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 ???
(不按比例)
这条线上的绝对点可以表示为:
两种格式都以不同的符号表示相同的绝对时间点。 前者是一个简单的计数器,大致从这里开始:
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);
从文档
返回自 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.