【问题标题】:How do I get the local system time in PHP?如何在 PHP 中获取本地系统时间?
【发布时间】:2011-01-20 17:31:30
【问题描述】:

我正在编写一个 PHP 系统,我需要获取系统时间。不是 GMT 时间或特定于时区的时间,而是 CRON 系统使用的相同系统时间。我有一个每天午夜运行的 CRON 作业,我想在网页上显示它需要多长时间才能再次运行。

例如: 现在我的系统时钟是下午 6 点。我运行代码:

$timeLeftUntilMidnight = date("H:i", strtotime("tomorrow") - strtotime("now"));

但是,结果是“3:00”而不是“6:00”。如果我跑

date("H:i", strtotime("tomorrow"));

它返回 0:00,这是正确的。但是如果我跑

date("H:i", strtotime("now"));

它返回 21:00,即使正确的应该是 18:00。

谢谢。

【问题讨论】:

  • 让我试着澄清一下:如果我运行 date("H:i", time()),它会显示从现在起 3 小时后的时间。因此, strtotime("tomorrow") - strtotime("now") 给我的时间比正确时间少 3 小时。例如,现在是下午 6 点,cronjob 将在上午 12 点运行,但 strtotime("tomorrow") - strtotime("now") 返回 3 小时,因为“明天”是 00:00 而“现在”是晚上 9 点。
  • @JohnWithoutArms 你能用这个代码更新你的帖子吗?
  • 使用time() 而不是strtotime("now")
  • 使用 time() 而不是 strtotime("now") 没有区别,仍然是相同的结果。
  • 可以,但是time()不必解析字符串“now”并将其识别为当前时间

标签: php time cron


【解决方案1】:

答案有很多,但在撰写本文时甚至没有一个正确的答案。

PHP time() 函数不会像大多数人认为的那样返回系统时间,但它会返回 PHP 本地时间,通常在 php.ini 中使用 date.timezone 设置,或者在脚本中使用 date_default_timezone_set() 设置。

例如,在我的一台服务器中,PHP 时间设置为Europe/Rome,系统时间设置为UTC。我的系统时间和 PHP 时间相差一小时。

我将为您提供一个适用于 Linux 的解决方案,我不知道是否适用于 Windows。在 Linux 中,系统时区设置为 /etc/timezone。现在,这通常超出了我允许的open_basedir 设置,但您可以将:/etc/timezone 添加到您的列表中以便能够读取该文件。

然后,在想要获取系统时间的脚本之上,您可以调用将脚本时区设置为系统时区的库函数。我想这个函数是一个类的一部分,所以我使用静态:

static function setSystemTz() {
    $systemTz = trim(file_get_contents("/etc/timezone"));
    if ($systemTz == 'Etc/UTC') $systemTz = 'UTC';
    date_default_timezone_set($systemTz);
}

更糟糕的是,PHP 5.3.3 'Etc/UTC' 无法识别,而 'UTC' 是,所以我不得不添加一个 if 来解决这个问题。

现在您可以愉快地拨打time(),它真的会给您系统时间。我已经测试过了,因为我自己需要它,这就是我现在发现这个问题的原因。

【讨论】:

    【解决方案2】:

    php 的time 会返回系统时间。你可以用date格式化它

    如果你只是想以访问者的当地时间显示时间,也许你最好使用一点 javascript

    【讨论】:

    • 我试过了,date("H:i", time()) 返回的是 GMT 时间,而不是本地系统时间。
    • 您确定您的服务器时间没有设置为格林威治标准时间吗?您的 cron 作业是否与您的 php 脚本在同一台服务器上运行?
    • date("H:i", time()) 调用的结果在我的 Windows 机器(系统时钟设置为本地时间)和 Linux 机器(检查“top”的时间,与我的 Windows 机器的本地时间相同)。结果是(正确的)GMT 时间,而不是本地时间。
    • CRON 作业在实际部署应用程序的 Linux 机器上运行。系统时间为本地时间,但代码仍返回 GMT 时间。
    • 但是问题是,如何获取系统时间,机器之一,而您的答案没有解决这个问题。
    【解决方案3】:

    这是最简单、最简单的方法:

    $sys_timestamp = strtotime(exec("date"));
    

    我们不要试图用 php 来欺骗它,让我们获取真正的系统时间;)

    (适用于任何基于 unix 的系统)

    【讨论】:

      【解决方案4】:

      time()

      会给你当前的系统时间戳。

      Manual

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

      【讨论】:

      • 然而 time() 将返回 PHP 本地时间,而不是系统(机器)时间。
      【解决方案5】:

      您可以使用time() 函数获取运行 PHP 的服务器的日期/时间——它将返回一个与当前日期时间相对应的时间戳。

      这是该服务器上的系统时间——与 cron 使用的相同。

      【讨论】:

      • time() 将返回 PHP 时间,而不是机器时间。
      【解决方案6】:

      如果您想要 GMT 时间,您可能需要使用gmtstrftime(),这将为您提供系统时间,但与 GMT 相同。 http://us2.php.net/gmstrftime 有更多信息。

      【讨论】:

      • time() 函数给了我 GMT 时间;我不想要 GMT 时间,我想要当前系统时间。
      【解决方案7】:

      如果您在格式化日期之后:

      date ('d/m/y h:i:s'); 
      

      可以解决问题,不需要将 time() 传递给日期,因为如果没有提供第二个参数,它将默认为当前系统时间。

      有关更多格式选项,请参见此处:http://php.net/manual/en/function.date.php

      否则你可以直接使用

      time()
      

      像其他人提到的那样,为您提供当前的 unix 时间戳。

      【讨论】:

      • 我明白,问题是 date() 调用给了我 GMT 时间,比我的系统时间早 3 小时。
      • @JohnWithoutArms,您确定您的服务器系统未设置为 GMT 吗?不带参数的 Date() 应该为您提供系统的当前时间戳,不涉及时区摆弄。
      • 是的...我在 Windows 机器上进行测试,托盘上的时间确实是我的当地时间,而不是 GMT。认为这可能是 Windows 问题,我将代码放在 Linux 服务器上,用“top”检查时间(它是正确的,当地时间),运行代码,结果相同。
      【解决方案8】:

      要获取系统的当前时间,您需要在 php.ini 文件中设置正确的date.timezone。例如,如果你来自印度,那么你会写:

      date.timezone = Asia/Calcutta
      

      对于德国,应该是:

      date.timezone = Europe/Berlin
      

      完成此操作后,date("Y-m-d H:i:s") 将提供您当前的时间。要获取您的时区,请参阅list of timezones supported by PHP

      【讨论】:

        【解决方案9】:

        试试这个:

        $time=date("h:i:s A", strtotime("now"-14));
        echo $time;
        

        您可以通过更改上面的数字14来调整时间。

        【讨论】:

          【解决方案10】:

          您可以通过下面的 Javascript 设置当前本地时间并将其设置在任何 PHP 变量中。

              <script>
          
                  // For 24 hours    
          
                  var ct = new Date();
                  var hr = ct.getHours();
                  var mt = ct.getMinutes();
                  if (mt < 10) {
                      mt = "0" + mt;
                  }
                  document.write("<b>" + hr + ":" + mt + " " + "</b>");    
          
          
                  // For 12 hours (AM / PM)
          
                  var ct = new Date();
                  var hr = ct.getHours();
                  var mt = ct.getMinutes();
          
                  var ampm = "AM";
          
                  if (hr >= 12) {
                      ampm = "PM";
                      hr = hr - 12;
                  }
                  if (hr == 0) {
                      hr = 12;
                  }
                  if (mt < 10) {
                      mt = "0" + mt;
                  }
          
                  document.write("<b>" + hr + ":" + mt + " " + ampm + "</b>");
          
             </script>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-14
            • 2016-05-05
            • 2020-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-24
            • 1970-01-01
            相关资源
            最近更新 更多