2010-10-13 3 views
16

Est-il possible de changer la date et l'heure actuelles de php (quelque chose comme set_time (strtotime ('1999-09-09')) quand j'appelle time() il me retournera l'horodateur pour 1999 -09 à 09? ai-je besoin de le mettre à l'échelle mondiale pour l'application entière.Modifier la date et l'heure d'aujourd'hui dans php

EDIT

J'ai déjà une ancienne application et je dois rendre possible de mettre en place la date actuelle. Je ne peux pas accepter Imaginez que je devrais passer en revue tout le code et remplacer chaque appel time() Même si je le ferai, cela n'aidera pas car il y a des fonctions comme getdate() que j'ai besoin de remplacer aussi

+0

Il est parfois nécessaire d'effectuer des mises à jour massives de projets entiers. C'est pourquoi ils ont inventé des systèmes de contrôle de révision. Il est également possible de créer un script qui recherche dans chaque fichier le texte "time()" et le remplace par "myTime()". C'est assez simple en utilisant 'file_get_contents()', 'str_replace()', et 'file_put_contents()'. – stevendesu

Répondre

9

Les fonctions time() demandent réellement l'horloge système pour l'heure, vous devez donc mettre à jour l'heure de l'horloge système du serveur. Quelques points à garder à l'esprit:

  • Ceci est fait différemment sur un serveur Unix qu'un serveur Windows. Si vous voulez un code compatible avec les deux, vous devez être prudent
  • Parfois (en particulier dans les situations d'hébergement mutualisé), vous n'êtes pas autorisé à changer l'heure du système
  • Modifications à l'heure du système resteront après le script a exécuté à moins que vous le changer plus tard. Par conséquent, vous risquez vraiment de bousiller l'horloge du système.

Si vous voulez changer l'heure dans le monde pour une application entière, je recommande d'avoir une variable statique $timeOffset et créez votre propre fonction time() comme suit:

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

Si vous avez pris tout cela en compte et que vous voulez encore changer l'heure du système, cependant, vous devez envoyer une commande au shell en utilisant shell_exec()

Dans Windows, le code ressemblerait à ceci:

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

Dans UNIX, selon la page de manuel date, le code ressemblerait à ceci:

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

Vous risquez quand même de visser l'horloge du système. Exemple: vous exécutez le script à 11:59:55, réglez l'horloge deux heures en arrière, terminez, réglez-la de deux heures en avant, elle indique maintenant 12:00:10. Malheureusement, vous aviez un processus prévu pour le lancement à 12:00:00 - sera-t-il lancé? La réponse est "personne ne sait" - selon l'horloge, 12:00:00 ne s'est jamais produit. (vous avez besoin de permissions assez élevées pour gâcher l'horloge quand même, et si vous utilisez le serveur en tant que root, vous êtes déjà dans une vingtaine de problèmes) – Piskvor

+0

comme je comprends j'ai besoin de droits appropriés pour changer la date par shell. Je ne suis pas sûr que cela soit possible pour www-data ou apache2. En tout cas bon point. Je vais vérifier. – vooD

1

Non, ce n'est pas. PHP obtient son temps de l'heure du système. La seule façon de changer ce que PHP voit comme le temps est de changer l'heure du système.

Il peut être possible pour vous de le faire en utilisant exec() ou quelque chose de similaire, mais probablement pas conseillé.

Une meilleure solution peut être de créer votre propre fonction de temps, que vous pouvez spécifier, en utilisant un décalage.

par exemple:

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

C'est juste quelque chose que j'ai jeté ensemble rapidement pour vous. Je ne l'ai pas testé, donc il y a peut-être des bugs, mais j'espère que ça vous donnera assez de solution.

2

PHP n'a pas de date et d'heure. time() renvoie l'horodatage actuel de l'heure du serveur. Selon votre système d'exploitation, il se peut que vous soyez (par ex.l'utilisateur qui exécute le processus de votre script) n'est en fait pas autorisé à changer la date et l'heure du serveur.

Qui pose une question différente: Pourquoi voulez-vous faire cela?

mieux serait de mettre en œuvre votre propre temps() fonction:

class myTime 
{ 

    private static $offset = 0; 

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

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

Et puis, partout où vous utilisez time(), utilisez myTime::getTime();. Pour définir l'heure, utilisez myTime::setTime($time)$time est l'horodatage que vous souhaitez utiliser.

0

Vous pouvez également essayer d'utiliser la variable globale $_SERVER['REQUEST_TIME'] (disponible depuis PHP 5.1.0) et la remplacer au moment de l'exécution.

10

Vous pouvez également vérifier le Timecop PHP module, a parfaitement fonctionné dans mon cas. Après l'installation, vous pouvez remonter & dans le temps avec une seule ligne de code.

+0

C'est un excellent outil. –

+0

Parfait! Cela devrait être la réponse acceptable! –