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

Php 在脚本执行时将Date()设置为特定的值,php,date,legacy,Php,Date,Legacy,我收集了一些到处使用date()的遗留代码。在每个月的31日(如果适用),脚本有一个bug,我需要能够复制它来修复。为了做到这一点,我需要脚本认为今天是31号 显然,我可以解析日期并给它一个我想要的日期字符串,但这必须在date()的每个实例上进行,这将很难更改,而且我可能很容易错过一个 因此,在脚本顶部是否有办法指定“今天的日期”是什么?或者,date()是否每次都从服务器获取日期,从而使这变得不可能 编辑 为了澄清,此脚本托管在Azure App Services上,这意味着很遗憾我无法更改

我收集了一些到处使用
date()
的遗留代码。在每个月的31日(如果适用),脚本有一个bug,我需要能够复制它来修复。为了做到这一点,我需要脚本认为今天是31号

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

因此,在脚本顶部是否有办法指定“今天的日期”是什么?或者,
date()
是否每次都从服务器获取日期,从而使这变得不可能

编辑


为了澄清,此脚本托管在Azure App Services上,这意味着很遗憾我无法更改系统的时间。

出于测试目的,您是否应该尝试重新声明日期?当然,PHP本身不允许这样做,但您可以使用
runkit

请注意:

默认情况下,只能删除、重命名或删除用户空间函数 被改进的。要覆盖内部功能,必须启用 php.ini中的runkit.internal\u覆盖设置


有一个过时的pecl扩展名为,它提供了一个函数
override\u function()
,它完全满足您的需要。没有测试它,但它可能不会再工作了

另一种方法是所谓的monkey patching,利用phps名称空间。参见示例和说明

namespace myNameSpace;

function date($format, $timestamp = '') {
    echo 'Would have returned "' . \date($format, $timestamp) . '"';
}
echo date('d.m.Y', time());

由于我们在名称空间\myNameSpace中,php将首先搜索\myNameSpace\date(),并使用它而不是\date()

更改系统时间通常限制在
根级别
帐户
PHP
将在Web服务器的用户id下运行,该id不应为root。为此,您必须使用
sudo
让Web服务器以提升的权限运行

假设服务器在windows上运行,我相信您可以执行
exec('date 11/24/2013')
。如果是基于linux的服务器,我认为您可以这样做:
exec('date-s“2013年11月24日12:38:00”)。

命令行:Linux设置日期命令示例

使用以下语法设置新数据和时间:

date --set="STRING"
例如,将新数据设置为2006年10月2日18:00:00,以root用户身份键入以下命令:

# date -s "2 OCT 2006 18:00:00"
或者,u还可以使用以下语法简化格式:

# date +%Y%m%d -s "20081128"

我认为最快的选择是设置服务器的
系统日期
。我也需要这些信息。假装有另一个系统时间来编写脚本,库可能会有所帮助。这有点复杂,但您可以使用它强制特定应用程序的日期(Apache/nginx或PHP,具体取决于您的配置)?让我检查一下,然后再给你回复。@Peter不幸的是,它托管在Azure上,我认为你无法更改应用程序服务的时间:/(至少我还没有看到)猴子补丁是一个好主意-没有外部依赖关系等。这是一个绝妙的方法
# date +%Y%m%d -s "20081128"