2010-10-13 35 views
16

¿Es posible cambiar la fecha y la hora actual de php (algo como set_time (strtotime ('1999-09-09')) así que cuando llamo time() me devolverá la marca de tiempo para 1999 -09-09? necesito para configurar globalmente para toda aplicación.Cambiar la fecha y hora actual en php

EDITAR

ya tengo una aplicación de edad y necesito para hacer posible establecer la fecha actual. no puedo aceptar cualquier función personalizada. Imagínense que debería revisar todo el código y reemplazar cada llamada de time(). Incluso si lo hago, no me ayudará porque hay funciones como getdate() que necesito reemplazar también.

+0

A veces, realizar actualizaciones masivas de proyectos completos es una necesidad. Es por eso que inventaron los sistemas de control de revisiones. También es posible crear un script que busca en todos los archivos el texto "time()" y lo reemplaza por "myTime()". Esto es bastante simple usando 'file_get_contents()', 'str_replace()', y 'file_put_contents()'. – stevendesu

Respuesta

9

En realidad, las funciones time() le preguntan al reloj del sistema por el tiempo, por lo que tendría que actualizar la hora del reloj del sistema del servidor. Algunas cosas a tener en cuenta:

  • Esto se hace de manera diferente en un servidor Unix que en un servidor de Windows. Si desea código compatible con ambos, debe tener cuidado
  • A veces (especialmente en situaciones de alojamiento compartido) no tiene permitido cambiar la hora del sistema
  • Los cambios en el tiempo del sistema se mantendrán después de que se haya ejecutado el script a menos que cambiarlo más tarde. Por lo tanto, corre el riesgo de arruinar realmente el reloj del sistema.

Si desea cambiar el tiempo a nivel mundial para toda una aplicación, recomiendo tener una variable estática $timeOffset y crear su propia función time() de la siguiente manera:

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

Si ha tomado todo eso en cuenta y todavía quieren cambiar la hora del sistema, sin embargo, que se necesita para enviar un comando al shell mediante shell_exec()

En Windows, el código se vería así:

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

En UNIX, según la página date hombre, el código se vería así:

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

Corre el riesgo de atornillar el reloj del sistema de todos modos. Ejemplo: ejecuta el script a las 11:59:55, ajusta el reloj dos horas atrás, finaliza, lo establece dos horas hacia adelante, ahora dice 12:00:10. Lamentablemente, tenía un proceso programado para su lanzamiento a las 12:00:00 - ¿se lanzará? La respuesta es "nadie sabe" - de acuerdo con el reloj, 12:00:00 nunca sucedió. (necesita permisos muy altos para meterse con el reloj de todos modos, y si está ejecutando el servidor como root, ya está en veinte tipos de problemas) – Piskvor

+0

como entiendo, necesito los derechos adecuados para cambiar la fecha a través de shell. No estoy seguro de que sea posible para el usuario de www-data o apache2. De todos modos, buen punto. Lo verificará. – vooD

1

No, no lo es. PHP obtiene su tiempo de la hora del sistema. La única forma en que puede cambiar lo que PHP ve es que la hora es cambiar la hora del sistema.

puede ser factible para que usted haga eso usando exec() o algo similar, pero probablemente no sea aconsejable.

Una mejor solución puede ser crear su propia función de tiempo, que puede especificar, utilizando un desplazamiento.

por ejemplo:

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(); 

Eso es sólo algo que he tirado juntos rápidamente para usted. No lo he probado, por lo que puede haber (probablemente) errores, pero espero que te brinde lo suficiente como para obtener una solución.

2

PHP no tiene una fecha y hora en sí mismo. time() devuelve la marca de tiempo actual de la hora del servidor. Dependiendo de su sistema operativo, bien puede ser que usted (es decirel usuario que ejecuta el proceso de su script) no tiene permitido cambiar la fecha y hora del servidor.

Lo que hace una pregunta diferente: ¿Por qué quieres hacer esto?

mejor sería implementar su propio tiempo de la función():

class myTime 
{ 

    private static $offset = 0; 

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

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

Y entonces, en todas partes donde se utiliza time(), utilice myTime::getTime();. Para establecer la hora, use myTime::setTime($time) donde $time es la marca de tiempo que desea usar.

0

También puede intentar utilizar la variable global $_SERVER['REQUEST_TIME'] (disponible desde PHP 5.1.0) y reemplazarla en tiempo de ejecución.

10

También podría marcar el Timecop PHP module, funcionó perfectamente en mi caso.

Después de instalarlo, puede retroceder & en el tiempo con solo una línea de código.

+0

Esta es una herramienta bastante excelente. –

+0

¡Perfecto! ¡Esta debería ser la respuesta aceptable! –

Cuestiones relacionadas