【问题标题】:Change today's date and time in php在php中更改今天的日期和时间
【发布时间】:2016-11-28 00:02:49
【问题描述】:

是否可以更改 php 的当前日期和时间(类似于 set_time(strtotime('1999-09-09'))所以当我调用 time() 时它会返回 1999-09-09 的时间戳?我需要为整个应用程序全局设置它。

编辑

我已经有一个旧应用程序,我需要设置当前日期。 我不能接受任何自定义功能。想象一下,我应该检查所有代码并替换每次 time() 调用。即使我这样做也无济于事,因为我也需要替换像 getdate() 这样的函数。

【问题讨论】:

  • 有时需要对整个项目进行大规模更新。这就是他们发明修订控制系统的原因。也可以创建一个脚本,在每个文件中搜索文本“time()”并将其替换为“myTime()”。使用file_get_contents()str_replace()file_put_contents() 相当简单。

标签: php datetime


【解决方案1】:

您还可以查看Timecop PHP module,在我的情况下效果很好。

安装后,只需要一行代码就可以在时间上来回穿梭。

【讨论】:

    【解决方案2】:

    time() 函数实际上是向系统时钟询问时间,因此您必须更新服务器系统时钟的时间。需要注意的几点:

    • 在 Unix 服务器上执行此操作的方式与在 Windows 服务器上不同。如果您希望代码兼容两者,则必须小心
    • 有时(尤其是在共享主机情况下)您不允许更改系统时间
    • 脚本执行后系统时间的更改将保留,除非您稍后将其更改回来。因此,您可能真的会搞砸系统时钟。

    如果您想全局更改整个应用的时间,我建议您使用静态变量 $timeOffset 并创建自己的 time() 函数,如下所示:

    function myTime(){
        global $timeOffset;
        return time()+$timeOffset;
    }
    

    如果您已将所有这些考虑在内,但仍想更改系统时间,则需要使用 shell_exec() 向 shell 发送命令

    在 Windows 中,代码如下所示:

    shell_exec("date 09-09-99"); // Use "date mm-dd-yy" or "time hh:mm:ss", respectively
    

    在 UNIX 中,根据 date 手册页,代码如下所示:

    shell_exec("date 0909hhmm1999"); // It says "date MMDDhhmiYYYY". I'm not sure how to set seconds, although I assume "mi" = "minutes"
    

    【讨论】:

    • 无论如何,你都有搞砸系统时钟的风险。示例:您在 11:59:55 运行脚本,将时钟拨回两小时,完成,将其拨快两小时,现在显示为 12:00:10。不幸的是,您有一个进程计划在 12:00:00 启动 - 它会启动吗?答案是“没人知道”——根据时钟,12:00:00 从未发生过。 (无论如何,你需要相当高的权限才能打乱时钟,如果你以 root 身份运行服务器,你已经遇到了 20 种麻烦)
    • 据我了解,我需要适当的权限才能通过 shell 更改日期。不确定 www-data 或 apache2 用户是否可行。无论如何好点。会检查的。
    【解决方案3】:

    PHP 没有自己的日期和时间。 time() 返回服务器时间的当前时间戳。根据您的操作系统,很可能实际上不允许您(即运行脚本进程的用户)更改服务器日期和时间。

    这提出了一个不同的问题:您为什么要这样做?

    最好实现自己的 time() 函数:

    class myTime
    {
    
        private static $offset = 0;
    
        public static function getTime()
        {
            return time() + self::$offset;
        }
    
        public static function setTime($time)
        {
            self::$offset = $time - time();
        }
    }
    

    然后,在您使用time() 的任何地方,使用myTime::getTime();。要设置时间,请使用myTime::setTime($time),其中$time 是您要使用的时间戳。

    【讨论】:

      【解决方案4】:

      不,不是。 PHP 从系统时间获取时间。更改 PHP 所看到的时间的唯一方法是更改​​系统时间。

      可能您可以使用 exec() 或类似的方式来执行此操作,但可能不建议这样做。

      更好的解决方案可能是创建您自己的时间函数,您可以使用偏移量来指定它。

      例如:

      function mytime() {
          return time()+set_mytime();
      }
      
      function set_mytime($new_time=null) {
          static $offset;
          if(!$new_time) {return $offset;}
          //$new_time should be a unix timestamp as generated by time(), mktime() or strtotime(), etc
          $real_time=time();
          $offset=$real_time-$new_time;
      }
      
      //usage:
      set_mytime(strtotime("1999-09-09");
      $faketime=mytime();
      .... do something that takes a bit of time ....
      $faketime2=mytime();
      

      这只是我为你快速整理的东西。我还没有测试过,所以可能有(可能有)错误,但我希望它能给你足够的解决方案。

      【讨论】:

        【解决方案5】:

        您也可以尝试使用全局 $_SERVER['REQUEST_TIME'] 变量(自 PHP 5.1.0 起可用)并在运行时替换它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-14
          • 1970-01-01
          • 2013-11-29
          • 1970-01-01
          相关资源
          最近更新 更多