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

Jie*_*eng 40 php

我只是想检查是否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)

(不按比例)

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

  • 1296096875
  • 2011年1月27日02:54:35欧洲/伦敦

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

                          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.

  • 我重写并澄清了*有点*.:) (2认同)

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)


Ste*_*ard 5

https://www.php.net/time

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

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