我只是想检查是否time()
返回UTC/GMT时间戳或我是否需要使用date_default_timezone_set()
?
dec*_*eze 95
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 ???
Run Code Online (Sandbox Code Playgroud)
(不按比例)
此行上的绝对点可表示为:
两种格式在不同的符号中表示相同的绝对时间点.前者是一个简单的计数器,大致在这里开始:
start of UNIX epoch
|
-------+-------------------+------++--------+----------------+------>
| | | | |
Dinosaurs died Jesus born Y2K Mars colonised ???
Run Code Online (Sandbox Code Playgroud)
后者是一个更复杂但同样有效和富有表现力的反制者,大致在这里开始:
start of Gregorian calendar
|
-------+-------------------+-------+--------+----------------+------>
| | | | |
Dinosaurs died Jesus born Y2K Mars colonised ???
Run Code Online (Sandbox Code Playgroud)
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
.
Jul*_*ian 15
从PHP 5.1.0开始(当日期/时间函数被重写时),如果时区无效,则每次调用日期/时间函数都会生成E_NOTICE,如果使用系统设置或TZ,则会生成E_WARNING消息环境变量.
因此,为了获得UTC时间戳,您应该检查当前时区是什么,然后使用它还是只使用:
$utc_str = gmdate("M d Y H:i:s", time());
$utc = strtotime($utc_str);
Run Code Online (Sandbox Code Playgroud)
“返回自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来以秒数测量的当前时间。”
所以我相信你的问题的答案是肯定的。