一尘不染

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

php

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


阅读 320

收藏
2020-05-26

共1个答案

一尘不染

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       ???

(不按比例)

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

  • 1296096875
  • 2011年1月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 表示 上图中
的时间轴上几乎没有任何内容。 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

2020-05-26