【问题标题】:Does PHP time() return a GMT/UTC Timestamp?PHP time() 是否返回 GMT/UTC 时间戳?
【发布时间】:2011-06-16 06:41:15
【问题描述】:

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

【问题讨论】:

    标签: php


    【解决方案1】:

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


    明确地说,UNIX 时间戳在任何给定时间在全世界都是相同的值。在撰写本文时,它在东京、伦敦和纽约是1296096875。要将其转换为“人类可读”时间,您需要指定要在哪个时区显示它。东京的12960968752011-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
    • 一月。 27 2011 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 在上图中的时间线上几乎没有任何意义。 一月。 27 2011 02:54:35 已经更具体了,但仍然可能意味着这条线上的各种不同点。 “当时钟在 2011 年 1 月 27 日 02:54:35 敲响时欧洲伦敦现在终于是这条线上的一个明确的绝对点,因为只有一个点在那个时候是真的。

    因此,时区是“挂钟时间”的“修饰符”,它是使用日历和小时/分钟/秒表示法表达唯一的绝对时间点所必需的。如果没有时区,则这种格式的时间戳是不明确的,因为全球每个国家/地区的时钟在 2011 年 1 月 27 日 02:54:35 敲响的时间不同。

    UNIX 时间戳本身不存在这个问题。


    要将 UNIX 时间戳转换为人类可读的挂钟时间,您需要指定您希望显示时间的时区。要将挂钟时间转换为 UNIX 时间戳,您需要知道哪个时区挂钟时间应该在。您必须在每次此类转换中每次都包含时区,或者将默认时区设置为与 date_default_timezone_set 一起使用。

    【讨论】:

    • 你说的不是自相矛盾吗? “时间返回一个 UNIX 时间戳,它与时区无关......”然后“它将根据设置的时区计算,因此如果您的时区设置不正确,时间戳将关闭......”认知失调。
    • UNIX 时间戳的格式 与时区无关。 UNIX 时间戳表示人类历史上一个独特的、绝对的点。但是,要从“挂钟时间”(例如“2011 年 1 月 26 日 21:54:35”)到达这个时间戳,需要考虑这个挂钟时间的时区。我承认这表达有些不清楚。
    • 我重写并澄清了一点。 :)
    • 很棒的文章 :) 虽然我认为您可以简单地说 UNIX 时间戳不能有时区,因为它是一个数字。这不是约会。这是几秒钟。和数字,不能有任何时区。我认为这就是时间戳的全部意义所在。
    • @jayarjo 好吧,“日期”也是“只是数字”。 2011-01-27 02:54:35 只是一堆数字,它们共同构成一个时间戳。问题是这些数字是相对的。 2011-01-27 与许多个月前出生的一个长头发的家伙有关。 02:54:35 与天空中可见的太阳和月亮有关,因位置而异,因此需要时区说明符1296096875 是一个相对于历史上任意固定点的数字,就像 2011-01-27
    【解决方案2】:

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

    因此,为了获得 UTC 时间戳,您应该检查当前时区并使用该时区只需使用:

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

    【讨论】:

    • time() 和 strtotime(gmdate("M d Y H:i:s", time())) 返回相同的结果:-\
    • 它们可能取决于您设置时区的方式,但并非总是如此。请参阅这些以获得更多说明:us3.php.net/manual/en/function.gmdate.php
    【解决方案3】:

    http://us3.php.net/time

    “返回当前时间,以自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的秒数为单位。”

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

    【讨论】:

      【解决方案4】:

      来自the documentation

      返回以 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00 GMT)以来的秒数为单位的当前时间。

      【讨论】:

        【解决方案5】:

        其中一个 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 小时 = 运行测试的服务器的时区偏移量。

        【讨论】:

          猜你喜欢
          • 2011-10-09
          • 2011-10-27
          • 1970-01-01
          • 2013-05-09
          • 1970-01-01
          • 2018-05-25
          • 2013-06-20
          • 2015-09-25
          相关资源
          最近更新 更多