我已经选择了一些在整个地方都使用date()
的遗留代码。在每个月的31日(如果适用),脚本有一个我需要能够复制以修复的错误。为了做到这一点,我需要脚本认为它是今天的第31个。
显然我可以解析日期并给它一个我想要的日期字符串,但这必须在date()
的每个实例上 - 这将很难改变,我可能会错过一个很容易
因此,在脚本的顶部是否有一种方法可以指定"今天的日期"是什么?或者date()
每次都从服务器获取日期,这是不可能的?
修改
为了澄清这个脚本是托管在Azure应用服务上的,这意味着我不能不幸地改变系统的时间。
答案 0 :(得分:2)
有一个名为apd的过时的pecl扩展名,它提供了一个功能override_function()
,它可以完全满足您的需求。没有测试它,但它可能不再起作用了。
另一种方法是所谓的猴子修补,利用phps命名空间。有关示例和解释,请参阅http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html。
namespace myNameSpace;
function date($format, $timestamp = '') {
echo 'Would have returned "' . \date($format, $timestamp) . '"';
}
echo date('d.m.Y', time());
由于我们在命名空间 \ myNameSpace ,php将首先搜索 \ myNameSpace \ date()并使用它代替 \ date()
答案 1 :(得分:0)
也许你应该尝试重新声明date
用于测试目的?当然,PHP本身不允许这样做,但您可以使用runkit
的{{3}}:
runkit_function_redefine('date','', 'return "XX-YY-ZZZZ";');
请注意:
默认情况下,只能删除,重命名或用户空间功能 改性。要覆盖内部函数,必须启用 php.ini中的runkit.internal_override设置。
答案 2 :(得分:-1)
更改系统时间通常仅限于root-level
个帐户。 PHP
将在Web服务器的用户ID下运行,该用户ID不应该是root用户。为了这个目的,您必须使用sudo
让网络服务器以提升的权限运行。 See this
假设服务器在Windows上运行,我相信你可以exec('date 11/24/2013')
。如果它是基于Linux的服务器,我认为你可以这样做:exec('date -s "24 NOV 2013 12:38:00"').
命令行:Linux Set Date命令示例
使用以下语法设置新数据和时间:
date --set="STRING"
例如,将新数据设置为2006年10月2日18:00:00,以root用户身份键入以下命令:
# date -s "2 OCT 2006 18:00:00"
或者您也可以使用以下语法简化格式:
# date +%Y%m%d -s "20081128"