Изменить сегодняшнюю дату и время в php - PullRequest
19 голосов
/ 13 октября 2010

Можно ли изменить текущую дату и время в php (что-то вроде set_time (strtotime ('1999-09-09')), чтобы при вызове time () возвращалась метка времени для 1999-09-09? Мне нужноустановить его глобально для всего приложения.

РЕДАКТИРОВАТЬ

У меня уже есть одно старое приложение, и мне нужно, чтобы можно было установить текущую дату. Я не могу принятьлюбые пользовательские функции. Представьте, что я должен просмотреть весь код и заменять каждый раз вызов (). Даже если я сделаю это, то это не поможет, потому что есть функции, такие как getdate (), которые мне также нужно заменить.

Ответы [ 5 ]

16 голосов
/ 20 февраля 2015

Вы также можете проверить Timecop PHP модуль , отлично работал в моем случае.

После установки вы можете путешествовать туда-сюда во времени всего одной строкой кода.

10 голосов
/ 13 октября 2010

Функции time() фактически запрашивают системные часы о времени, поэтому вам придется обновить время системных часов сервера. Несколько вещей, которые нужно иметь в виду:

  • Это делается на сервере Unix иначе, чем на сервере Windows. Если вы хотите, чтобы код был совместим с обоими, вы должны быть осторожны
  • Иногда (особенно в ситуациях с общим хостингом) вам не разрешено менять системное время
  • Изменения системного времени останутся после выполнения скрипта, если вы не измените его позже. Поэтому вы рискуете действительно испортить системные часы.

Если вы хотите глобально изменить время для всего приложения, я рекомендую иметь статическую переменную $timeOffset и создать собственную функцию time() следующим образом:

function myTime(){
    global $timeOffset;
    return time()+$timeOffset;
}

Если вы учли все это и все еще хотите изменить системное время, вам нужно будет отправить команду в оболочку, используя shell_exec()

В Windows код будет выглядеть так:

shell_exec("date 09-09-99"); // Use "date mm-dd-yy" or "time hh:mm:ss", respectively

В UNIX, согласно справочной странице date, код будет выглядеть так:

shell_exec("date 0909hhmm1999"); // It says "date MMDDhhmiYYYY". I'm not sure how to set seconds, although I assume "mi" = "minutes"
2 голосов
/ 13 октября 2010

PHP не имеет даты и времени самостоятельно.time () возвращает текущую временную метку времени сервера.В зависимости от вашей операционной системы вполне может оказаться, что вам (то есть пользователю, выполняющему процесс вашего скрипта) фактически не разрешено изменять дату и время на сервере.

Что задает другой вопрос: зачем вамчтобы сделать это?

Лучше было бы реализовать собственную функцию time ():

class myTime
{

    private static $offset = 0;

    public static function getTime()
    {
        return time() + self::$offset;
    }

    public static function setTime($time)
    {
        self::$offset = $time - time();
    }
}

И затем везде, где вы используете time(), используйте myTime::getTime();.Чтобы установить время, используйте myTime::setTime($time), где $time - это отметка времени, которую вы хотите использовать.

1 голос
/ 13 октября 2010

Нет, это не так.PHP получает свое время от системного времени.Единственный способ изменить то, что PHP видит как время, - это изменить системное время.

Это может быть возможным для вас, используя exec() или что-то подобное, но, вероятно,не рекомендуется.

Лучшим решением может быть создание собственной функции времени, которую вы можете указать, используя смещение.

Например:

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

//usage:
set_mytime(strtotime("1999-09-09");
$faketime=mytime();
.... do something that takes a bit of time ....
$faketime2=mytime();

Это просто что-тоЯ быстро собрался для тебя.Я не проверял это, поэтому могут быть (вероятно, есть) ошибки, но я надеюсь, что это даст вам достаточно, чтобы получить решение.

0 голосов
/ 11 апреля 2014

Вы также можете попробовать использовать глобальную переменную $_SERVER['REQUEST_TIME'] (доступна с PHP 5.1.0) и заменить ее во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...