在PHP中更改今天的日期和时间

31

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

编辑

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


有时对整个项目进行大规模更新是必要的。这就是为什么发明了版本控制系统的原因。还可以创建一个脚本,搜索每个文件中的文本“time()”,并将其替换为“myTime()”。使用file_get_contents()str_replace()file_put_contents()相当简单。 - stevendesu
6个回答

20

你也可以检查一下Timecop PHP 模块,在我的情况下完美运行。

安装后,只需一行代码即可穿梭于时间之间。


不再维护,但请参考 https://github.com/kiddivouchers/php-timecop 上的分支,或者查看我的答案以获取 Linux 下的另一种选择。 - Roger Dueck

13
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 man页面,代码如下:

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

7
你冒着破坏系统时间的风险。例如:在11:59:55运行脚本,将时钟往后调两个小时,完成后再将它往前调两个小时,此时显示时间为12:00:10。不幸的是,你计划在12:00:00启动一个进程 - 它会启动吗?答案是“没有人知道” - 根据时钟,12:00:00从未发生过。(无论如何,你需要相当高的权限才能更改时钟,如果你以root身份运行服务器,你已经遇到了各种问题。) - Piskvor left the building
据我所知,我需要透过 shell 获得适当的权限才能更改日期。不确定 www-data 或 apache2 用户是否有此权限。无论如何,这是个好点子。我会去查一下。 - vooD

5

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是您想要使用的时间戳。


1

不是这样的。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();

这只是我为你快速拼凑的东西。我还没有测试过它,所以可能会有(很可能有)错误,但我希望它能给你足够的信息来解决问题。


0

如果你在Linux命令行上运行PHP脚本,可以使用faketime实用程序来更改PHP(或任何程序)所看到的系统时间。它还允许您更改时间推进的速率。

请注意,从外部服务获取的时间,例如通过数据库查询(即SELECT NOW()),将继续显示系统时间,除非它们也已经使用faketime启动。

感谢@zmf提供hnw/php-timecop链接(不再维护),这使我找到了活跃的分支kiddivouchers/php-timecop,其中在最新提交中提到了faketime


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接