IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Dates] Problème de dates au 29 octobre.


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut [Dates] Problème de dates au 29 octobre.
    Bonjour,

    Je viens de me rendre compte d'un phénomène bizzare à mes dépends : Le timestamp avance de 90000 minutes entre le 29 et le 30 octobre au lieu de 86400 !

    Faites l'expérience :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo strtotime('2006/10/28');
    		echo '  ';
    		echo strtotime('2006/10/29');
    		echo '  ';
    		echo strtotime('2006/10/30');
    		echo '  ';
    		echo strtotime('2006/10/31');
    		echo '  ';
    		echo strtotime('2006/11/01');
    		echo '  ';
    		echo strtotime('2006/11/02');
    		echo '  ';
    Donne la chaine suivante :
    1161986400 1162072800 1162162800 1162249200 1162335600 1162422000

    L'écart d'un jour est normalement de 86400 secondes, mais entre le 29 et le 30 on à 90000 au lieu de 86400 soit une heure de décalage.

    Pourquoi ? Pourquoi le 29 au 30 cela correspondrait au changement d'heure ? Si c'est le cas l'opération inverse (fonction date) ne prend pas en compte ce changement et si on ajoute 86400 secondes (1 jour) au 29 on est encore au 29 ! et si on ajoute 7 jours on se retrouve 6 jours plus tard.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    C'est énervant ce changement d'heure non?

    Mais il y a une solution. Pas avec strtotime() mais bien avec mktime() et son argument is_dst.

    is_dst

    Ce paramètre peut être mis à 1 si l'heure d'hiver est appliquée (DST), 0 si elle ne l'est pas, et -1 (par défaut) si on ne sait pas. Si l'on ne sait pas, PHP tente de le traiter lui-même. Ceci peut occasionner des résultats inattendus (mais néanmoins correct). Quelques temps sont invalides si DST est activé sur les systèmes où PHP fonctionne ou is_dist est défini à 1. Si DST est activé e.g. 2:00, tous les temps entre 2:00 et 3:00 sont invalides et la fonction mktime() retourne une valeur indéfinie (généralement une valeur négative). Quelques systèmes (e.g. Solaris 8) activent DST à minuit, donc, le temps 0:30 du jour lorsque DST est activé est évalué à 23:30 du jour précédent.
    Pour reprendre ton exemple, essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo '<pre><h3>Sans is_dst</h3>';
    echo strtotime('2006/10/28'), ' mktime -> ', mktime(0, 0, 0, 10, 28, 2006), "\n";
    echo strtotime('2006/10/29'), ' mktime -> ', mktime(0, 0, 0, 10, 29, 2006), "\n";
    echo strtotime('2006/10/30'), ' mktime -> ', mktime(0, 0, 0, 10, 30, 2006), "\n";
    echo strtotime('2006/10/31'), ' mktime -> ', mktime(0, 0, 0, 10, 31, 2006), "\n";
    echo strtotime('2006/11/01'), ' mktime -> ', mktime(0, 0, 0, 11, 01, 2006), "\n\n";
    echo '<h3>AVEC is_dst sur 1</h3>';
    echo strtotime('2006/10/28'), ' mktime -> ', mktime(0, 0, 0, 10, 28, 2006, 1), "\n";
    echo strtotime('2006/10/29'), ' mktime -> ', mktime(0, 0, 0, 10, 29, 2006, 1), "\n";
    echo strtotime('2006/10/30'), ' mktime -> ', mktime(0, 0, 0, 10, 30, 2006, 1), "\n";
    echo strtotime('2006/10/31'), ' mktime -> ', mktime(0, 0, 0, 10, 31, 2006, 1), "\n";
    echo strtotime('2006/11/01'), ' mktime -> ', mktime(0, 0, 0, 11, 01, 2006, 1), "\n";
    J'utilise toujours mktime avec cette option pour les calculs de dates.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  3. #3
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Merci, c'est intéressant ce que tu me dis, je vais tester ça dès demain matin.

    Par contre je ne sais pas si ça va m'aider vu que je manipule directement les timestamp's pour avancer/reculer dans le temps (pour avancer de 7 jours je fais 'd1 + (7 * 86400)' par exemple). Je pense que je vais juste devoir faire mumuse en rajoutant 3600 à mon résultat si les dates sont à cheval sur la date du 29/10/2006 et en retirer 3600 si je suis à cheval sur la date du changement d'heure d'été.

    J'imagine juste le bronx le jour ou l'état décide de ne plus changer d'heure en été / hiver On à failli il y à quelques années.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  4. #4
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    Salut ...

    Pour répondre à ta question non !!! c'est encore plus simple avec mktime().

    mktime() renvoi un timestamp UNIX comme indiqué dans la doc.
    du coup .. voila ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // structure du mktime
    mktime ( $hour , $minute , $second , $month , $day , $year , $is_dst)
    ce qui nous donne par exemple une date quelconque : 29-10-2006

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    // j'en profite pour vous présenter une de mes fonction favorite 
    // affecte les variable passées en paramétre ---- dateDetail('aaaa-mm-jj', 'US', $jour, $mois, $annee)
    function dateDetail($date, $type='US', &$jour, &$mois, &$annee)
    	{
    	$Date = explode('-',$date);
    	if ($type=='US')
    		{
    		$jour=$Date[2];
    		$mois=$Date[1];
    		$annee=$Date[0];
    		}
    	else
    		{
    		$jour=$Date[0];
    		$mois=$Date[1];
    		$annee=$Date[2];
    		}
    	}
     
    $date = '29-10-2006';
    dateDetail($date, 'FR', $jour, $mois, $annee)
    echo 'Date donnée : '.$date;
     
    // nombre de jour voulu
    $x=1;
     
    $newDate = getDate(mktime(0, 0, 0, $mois, ($jour+$x), $annee, 1));
    $newDate = $newDate['year'].'-'.sprintf('%02d', $newDate['mon']).'-'.sprintf('%02d', $newDate['mday']);
    echo 'Date après '.$x.' jour(s) ajouté(s)';
    j'ai pas vérifié la syntaxe, ... mais c'est un truc comme ça

    @+

  5. #5
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Merci Max, c'est du tout fait

    Bon, pour Ripat : j'ai essayé avec mktime et j'ai les mêmes résultats en manipulant mktime et en effectuant des strtotime et ce autant avec le '1' et sans.

    Inspiré par vos code j'ai fait cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $d1 = strtotime($_POST[$GLOBALS['vn_begindate']]);
    			$d2 = '';
    			echo $_POST[$GLOBALS['vn_begindate']];
    			echo '  '.$d1;
    			$Temp = explode('/', $_POST[$GLOBALS['vn_begindate']]);
     
    			$jour=$Temp[2];
    			$mois=$Temp[1];
    			$annee=$Temp[0];
     
    			$x = $_POST[$GLOBALS['vn_duration']] * 7;
    			echo '  '.$x;
    			$d2 = mktime(0, 0, 0, $mois, ($jour + $x), $annee, 1);
    			echo '   '.$d2.'   '.date("Y/m/d",$d2);
    Qui me donne en résultat :

    2006/10/28 1161986400 7 1162591200 2006/11/03
    Oui, avec le mktime c'est comme quand je fesait + (7 * 86400) sur mes timestamp : lorsqu'on veux récupérer la date il manque un jour.

    Je ne vois qu'une seule solution : ajouter une heure dans le mktime pour compenser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $d2 = mktime(1, 0, 0, $mois, ($jour + $x), $annee, 1);
    Ca marche et ne me pose pas de problèmes, de plus si la date du changement d'heure change je ne serais pas affecté car je peux me permettre d'agir avec +1h toute l'année, ça ne changera pas mes dates.

    Merci et si vous avez des remarques n'hésitez pas à les ajouter.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    Si c'est pour une histoire de décalage horaire moi j'avais réglé le problème pour placer ma référence temps à 12h et qu'une journée c'est 12h-12h+12h qui fait un écart de 24h.
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  7. #7
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Citation Envoyé par berceker united
    Si c'est pour une histoire de décalage horaire moi j'avais réglé le problème pour placer ma référence temps à 12h et qu'une journée c'est 12h-12h+12h qui fait un écart de 24h.

    Comme tu as du comprendre en lisant mes deux derniers posts, je travaille avec des dates au format texte que je convertis avant et après traitement. Donc ça repars à 00h à chaque fois.

    J'ai résolu le pb en ajoutant 1h aux resultats pour m'assurer de ne pas trainer derrière.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    Citation Envoyé par Harry
    Comme tu as du comprendre en lisant mes deux derniers posts, je travaille avec des dates au format texte que je convertis avant et après traitement. Donc ça repars à 00h à chaque fois.

    J'ai résolu le pb en ajoutant 1h aux resultats pour m'assurer de ne pas trainer derrière.
    Donc lorsque nous devons retirer 1h toi tu retombe à 00h ce qui fait que tu es toujours sur tes pattes?
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  9. #9
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Citation Envoyé par berceker united
    Donc lorsque nous devons retirer 1h toi tu retombe à 00h ce qui fait que tu es toujours sur tes pattes?
    Oui, c'est exactement ça. Et si je suis juste sur la bascule de l'heure d'été je serai à 2h.

    Attention le .NET sur PDA peut causer des chutes de cheveux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] Problème de date
    Par nicoaix dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2006, 15h33
  2. [Dates] Problème de date => 2006-04-04T19:00:00
    Par Sam53 dans le forum Langage
    Réponses: 4
    Dernier message: 04/04/2006, 00h09
  3. [Dates] Problème de date : jours ouvrés notamment
    Par rob2-9 dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2006, 13h46
  4. [Dates] Problème de date : ajouter 7 jours
    Par clairette dans le forum Langage
    Réponses: 8
    Dernier message: 24/01/2006, 18h40
  5. [Dates] problème Comparaison dates
    Par gwen-al dans le forum Langage
    Réponses: 4
    Dernier message: 06/01/2006, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo