【发布时间】:2011-06-16 06:41:15
【问题描述】:
我只想检查 time() 是否返回 UTC/GMT 时间戳,还是需要使用 date_default_timezone_set()?
【问题讨论】:
标签: php
我只想检查 time() 是否返回 UTC/GMT 时间戳,还是需要使用 date_default_timezone_set()?
【问题讨论】:
标签: php
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。
实际上,您在处理时间时通常会处理(混合)这些概念:
像这样可视化时间:
-------+-------------------+-------+--------+----------------+------>
| | | | |
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 在上图中的时间线上几乎没有任何意义。 一月。 27 2011 02:54:35 已经更具体了,但仍然可能意味着这条线上的各种不同点。 “当时钟在 2011 年 1 月 27 日 02:54:35 敲响时欧洲伦敦”现在终于是这条线上的一个明确的绝对点,因为只有一个点在那个时候是真的。
因此,时区是“挂钟时间”的“修饰符”,它是使用日历和小时/分钟/秒表示法表达唯一的绝对时间点所必需的。如果没有时区,则这种格式的时间戳是不明确的,因为全球每个国家/地区的时钟在 2011 年 1 月 27 日 02:54:35 敲响的时间不同。
UNIX 时间戳本身不存在这个问题。
要将 UNIX 时间戳转换为人类可读的挂钟时间,您需要指定您希望显示时间的时区。要将挂钟时间转换为 UNIX 时间戳,您需要知道哪个时区挂钟时间应该在。您必须在每次此类转换中每次都包含时区,或者将默认时区设置为与 date_default_timezone_set 一起使用。
【讨论】:
2011-01-27 02:54:35 只是一堆数字,它们共同构成一个时间戳。问题是这些数字是相对的。 2011-01-27 与许多个月前出生的一个长头发的家伙有关。 02:54:35 与天空中可见的太阳和月亮有关,因位置而异,因此需要时区说明符。 1296096875 是一个相对于历史上任意固定点的数字,就像 2011-01-27。
从 PHP 5.1.0 开始(日期/时间函数被重写),每个 如果时区调用日期/时间函数将生成 E_NOTICE 如果使用系统设置,则无效,和/或 E_WARNING 消息 或 TZ 环境变量。
因此,为了获得 UTC 时间戳,您应该检查当前时区并使用该时区或只需使用:
$utc_str = gmdate("M d Y H:i:s", time());
$utc = strtotime($utc_str);
【讨论】:
“返回当前时间,以自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的秒数为单位。”
所以我相信你的问题的答案是肯定的。
【讨论】:
返回以 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00 GMT)以来的秒数为单位的当前时间。
【讨论】:
其中一个 cmets 声称:“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
Diff 是 18000 秒 = 5 小时 = 运行测试的服务器的时区偏移量。
【讨论】: