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

php
2022-08-30 11:24:22

我只想检查是否返回UTC / GMT时间戳或我需要使用?time()date_default_timezone_set()


答案 1

time返回一个 UNIX 时间戳,该时间戳与时区无关。由于 UNIX 时间戳表示自 1970 UTC 以来的秒数,因此你可以说它是 UTC,但它实际上没有时区。


需要明确一点的是,UNIX 时间戳在任何给定时间在世界各地都是相同的值。在撰写本文时,它位于东京,伦敦和纽约。要将其转换为“人类可读”时间,您需要指定要在哪个时区显示它。 在东京是,在伦敦是,在纽约是。129609687512960968752011-01-27 11:54:352011-01-27 02:54:352011-01-26 21:54:35

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

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

像这样想象时间:

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

(不缩放)

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

  • 1296096875
  • 2011年01月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


答案 2

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

因此,为了获得UTC时间戳,您应该检查当前时区是什么,然后使用它,或者只使用:

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

推荐