2010-09-27 7 views
3

Je voudrais revenir en arrière le temps de 10 secondes avant l'heure actuelle et la sortie à cette date de format (H/i/s)PHP Remontez le temps

Comment puis-je faire cela?

Je ne veux pas obtenir l'heure actuelle, puis supprimer 10 secondes de temps.

Merci

+7

Pour quelles raisons ne voulez-vous pas déduire 10 secondes de quelque chose comme 'time()'? – alex

Répondre

7
echo date('H/i/s', time()-10); 
+0

Cette réponse n'est plus valide – NullUserException

+0

@NullUserException, Pourquoi pas? –

+0

Je pensais que l'utilisateur a édité la question pour signifier qu'ils voulaient changer l'heure du système. – NullUserException

3

Pour changer l'heure du système, vous devez appeler l'API du système d'exploitation pour changer l'heure. Sous Linux, vous pouvez le faire avec la commande date:

date MMDDhhmmYYYY.ss 

Par exemple, date 092619222010.30 fixera la date et l'heure à Sep 26 2010 19:22:30. Sur PHP, vous pouvez essayer d'utiliser la fonction system() pour ce faire.

$stamp = date('mdHiY.s', time()-10); 
system("date $stamp"); 

PHP fonctionne comme le même utilisateur que Apache si elle est en cours d'exécution sous mod_php (la configuration par défaut). Cela signifie généralement que vous n'aurez pas les autorisations pour le faire. Si cela se produit, vous pouvez contourner le problème en appelant un autre script ou programme que peut modifier l'heure.

+0

Ce n'est pas la réponse qu'il voulait.Il demandait une solution en PHP, qui fonctionne généralement comme le même utilisateur que le serveur web. Même avec system(), il ne pourra pas changer l'heure du système. – halfdan

+0

@halfdan Eh bien, que suggérez-vous? – NullUserException

+0

Voir la réponse acceptée. Il veut juste sortir le formulaire de temps il y a 10 secondes, ne pas changer l'heure du système. Alors pourquoi ne pas soustraire 10seconds de time()? – halfdan

5

J'essaie personnellement d'éviter de jouer directement avec la valeur time(), pour des raisons lorsque vous essayez d'ajouter ou de soustraire des jours/semaines/etc. avec des années bissextiles, etc. Pour toutes fins pratiques, strtotime() est toujours fiable:

echo date('H/i/s', strtotime('-10 seconds', time())); // time() - 10 seconds 

** EDIT **

Pourquoi time() - 10 est not good?

<?php 
// this is my timezone, but it applies to any DST zones.... 
date_default_timezone_set('America/Montreal'); 

$time = strtotime('2010-11-07 02:00:05'); 

var_dump(date(DATE_RFC822, $time - 10)); 
var_dump(date(DATE_RFC822, strtotime('-10 seconds', $time))); 

La sortie de c'est

string(29) "Sun, 07 Nov 10 01:59:55 -0500" 
string(29) "Sun, 07 Nov 10 01:59:55 -0400" 

Notez comment l'UTC change dans le second exemple? Où il n'est pas entièrement correct et devrait être Sun, 07 Nov 10 02:59:55 -0500(voir here pour le réinitialiser à l'UTC correct) soustrayant 10 à time() est encore pire! Il renvoie un horodatage d'une heure dans le temps. Ceci peut conduire à des erreurs de données potentielles, etc.

La même chose s'applique en ajoutant et en soustrayant des jours et des mois; manipuler directement time() n'est tout simplement pas une bonne idée et strtotime() retournera toujours l'horodatage correct pour la manipulation du temps donné. Période.

+0

"valeur, pour des raisons lorsque vous essayez d'ajouter ou de soustraire jours/semaines/etc .. avec des années bissextiles, etc" --- temps() est juste un certain nombre de secondes depuis Unix époque et n'a rien à voir avec les années bissextiles, etc. Il se développe de façon monotone indépendamment de l'année bissextile ou toute autre chose. – zerkms

+0

@zerkms, lisez le edit –

+0

Je le sais, et maintenant vous obtenez 'echo $ time - strtotime ('- 10 secondes', $ time);'. Mais seulement 10 secondes à gauche, pas 3610. Le problème est dans le formatage de la date, pas dans son calcul. Le temps s'écoule de façon monotone, et s'il reste 10 secondes, alors la différence est de 10. Si non, fixez votre fonction date(). – zerkms