Изменить сегодняшнюю дату и время в php

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

ИЗМЕНИТЬ

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

Ответы

Ответ 1

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

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

Если вы хотите изменить время в глобальном масштабе для всего приложения, я рекомендую иметь статическую переменную $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 man, код будет выглядеть так:

shell_exec("date 0909hhmm1999"); // It says "date MMDDhhmiYYYY". I'm not sure how to set seconds, although I assume "mi" = "minutes"

Ответ 2

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

После его установки вы можете перемещаться вперед и назад во времени только с одной строкой кода.

Ответ 3

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

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

Лучше было бы реализовать свою собственную функцию 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 - это метка времени, которую вы хотите использовать.

Ответ 4

Нет, это не так. 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();

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

Ответ 5

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