Установите Date () на что-то конкретное во время выполнения скрипта

Я взял какой-то устаревший код, который использует date() повсюду. 31-го числа каждого месяца (если применимо) в скрипте есть ошибка, которую я должен быть в состоянии исправить, чтобы исправить. Чтобы сделать это, мне нужен сценарий, чтобы подумать, что сегодня он 31-й.

Очевидно, я мог бы разобрать дату и дать ей строку с желаемой датой, но это должно было бы быть при каждом экземпляре date() — что было бы очень трудно изменить, и я мог легко пропустить один.

Таким образом, есть ли в верхней части сценария средство для указания, что такое «сегодняшняя дата»? Или делает date() получать дату с сервера каждый раз, делая это невозможным?

редактировать

Для пояснения этот сценарий размещен в службах приложений Azure, что означает, что, к сожалению, я не могу изменить время системы.

3

Решение

Существует устаревшее расширение pecl, которое называется APD которая обеспечивает функцию 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 \ дата () и использовать это вместо \Дата().

2

Другие решения

Может быть, вы должны попытаться переопределить date в целях тестирования? Конечно, сам PHP не допустит этого, но вы можете использовать runkit«s runkit_function_redefine ():

runkit_function_redefine('date','', 'return "XX-YY-ZZZZ";');

Просто отметьте, что:

По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или
модифицирована. Чтобы переопределить внутренние функции, вы должны включить
Настройка runkit.internal_override в php.ini.

0

Изменение системного времени обычно ограничено root-level Счета. PHP будет работать под идентификатором пользователя веб-сервера, который НЕ ДОЛЖЕН БЫТЬ root. Вам придется использовать sudo позволить веб-серверу работать с повышенными правами для этой цели. Видеть это

Предполагая, что сервер работает на Windows, я думаю, вы могли бы сделать exec('date 11/24/2013'), Если это сервер на основе Linux, я думаю, вы можете сделать что-то вроде этого: exec('date -s "24 NOV 2013 12:38:00"').

Командная строка: пример команды Linux Set Date

Используйте следующий синтаксис для установки новых данных и времени:

date --set="STRING"

Например, установите новые данные на 2 октября 2006 г. 18:00:00, введите в качестве пользователя root следующую команду:

# date -s "2 OCT 2006 18:00:00"

ИЛИ вы также можете упростить форматирование, используя следующий синтаксис:

# date +%Y%m%d -s "20081128"
-1
По вопросам рекламы [email protected]