#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. выполняете ли вы какие-либо вычисления в это время?