在脚本执行时将Date()设置为特定的内容

时间:2016-06-03 10:44:08

标签: php date legacy

我已经选择了一些在整个地方都使用date()的遗留代码。在每个月的31日(如果适用),脚本有一个我需要能够复制以修复的错误。为了做到这一点,我需要脚本认为它是今天的第31个。

显然我可以解析日期并给它一个我想要的日期字符串,但这必须在date()的每个实例上 - 这将很难改变,我可能会错过一个很容易

因此,在脚本的顶部是否有一种方法可以指定"今天的日期"是什么?或者date()每次都从服务器获取日期,这是不可能的?

修改

为了澄清这个脚本是托管在Azure应用服务上的,这意味着我不能不幸地改变系统的时间。

3 个答案:

答案 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"