Есть ли какой-нибудь способ «обмануть» отдельный PHP-скрипт, заставив его думать, что системные часы / дата — это нечто иное, чем то, что есть на самом деле?

#php #date #datetime #time #clock

#php #Дата #дата и время #время #часы

Вопрос:

Мне нужно отладить все виды проблем, связанных со временем. Одна ошибка происходит только в течение одного часа каждые шесть месяцев. Утомительно ждать полгода одночасового окна, чтобы исправить эту ошибку. Из-за этого и подобных тестовых ситуаций я хотел бы «подделать системные часы / дату» для отдельного PHP-скрипта.

Это не должно изменять фактические системные часы / дату! На самом деле изменение этого было бы катастрофическим для всех видов журналов, которые я веду, независимо от того, насколько кратко.

Я хочу иметь возможность делать что-то вроде:

 set_fake_time_for_this_script('1995-05-04 04:24:15');
sleep(3);
var_dump(time()); // Will not return the timestamp for my computer's system clock, but instead "1995-05-04 04:24:18".
// Any other time-related functions will also use that fake time/date as the "present time".
  

Возможно ли это? Если да, то как? Пожалуйста, скажите мне, что это так…

Ответ №1:

Это невозможно, поскольку PHP реализует функциональность времени.

PHP считывает время с сервера, на котором он размещен (в вашем случае это может быть ваш компьютер), и поэтому вы не можете изменить время просто так.

Однако есть умный способ сделать то, что вам нужно. Поскольку время — это просто временная метка по своей сути, и это число, найдите разницу (положительную или отрицательную) временной метки между текущим временем и временем, которое вы хотите установить в своей функции. Вы получите смещение.

Затем выполните все вычисления, которые вы хотите выполнить со временем, и добавьте к этому смещение. Таким образом, вы получите всю функциональность time без повторной реализации всех временных функций.

 
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;
}
  

Кроме того, если вы очень заинтересованы в изменении времени, вы можете использовать exec функцию и вызвать системные команды для этого. Однако, пожалуйста, обратите внимание, что случайное изменение времени для всей системы приведет к неожиданным результатам.

Комментарии:

1. Но я редко использую time() … Поэтому мне нужно было бы выяснить, как (если это вообще возможно) отправлять «пользовательское время» в любое место, куда отправляется время. Который варьируется для каждой функции, связанной с временем, если он вообще есть…

2. выполняете ли вы какие-либо вычисления в это время?