是否可以更改PHP的当前日期和时间(类似于set_time(strtotime('1999-09-09')))以便当我调用time()时它会返回1999-09-09的时间戳?我需要全局设置整个应用程序。
编辑
我已经有一个旧的应用程序,我需要设置当前日期。 我不能接受任何自定义函数。 想象一下,我应该检查所有代码并替换每个time()调用。 即使我这样做也没有帮助,因为还有像getdate()这样的函数需要替换。
你也可以检查一下Timecop PHP 模块,在我的情况下完美运行。
安装后,只需一行代码即可穿梭于时间之间。
time()
函数实际上是向系统时钟请求时间,因此您必须更新服务器系统时钟的时间。请注意以下几点:
如果要为整个应用程序全局更改时间,建议创建一个静态变量$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"
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
是您想要使用的时间戳。
不是这样的。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();
这只是我为你快速拼凑的东西。我还没有测试过它,所以可能会有(很可能有)错误,但我希望它能给你足够的信息来解决问题。
如果你在Linux命令行上运行PHP脚本,可以使用faketime
实用程序来更改PHP(或任何程序)所看到的系统时间。它还允许您更改时间推进的速率。
请注意,从外部服务获取的时间,例如通过数据库查询(即SELECT NOW()
),将继续显示系统时间,除非它们也已经使用faketime
启动。
感谢@zmf提供hnw/php-timecop链接(不再维护),这使我找到了活跃的分支kiddivouchers/php-timecop,其中在最新提交中提到了faketime
。
您也可以尝试使用全局变量$_SERVER['REQUEST_TIME']
(自PHP 5.1.0起可用),并在运行时进行替换。
file_get_contents()
、str_replace()
和file_put_contents()
相当简单。 - stevendesu