Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion des heures

Sujet résolu
Anonyme
    19 janvier 2020 à 17:03:09

    Bonjour,

    Je crée un forum où des Africains pourraient discuter ensemble, donc avec des fuseaux horaires différents ;

    J'enregistre la date des posts en base de données sous le format UTC,

    Puis j'affiche à l'utilisateur X les posts selon le fuseau horaire qu'il a choisi.

    Voici mon code :

    Ajout du post :

    public function add(array $data, int $subject) 
        {
            $pdo = Connection::getPDO();
    
            $date = new DateTime('now', new DateTimeZone('UTC'));
    
            $query = $pdo->prepare('INSERT INTO `post` (`content`, `author`, `subject`, `alert`, `created_at`) VALUES (:content, :author, :subject, :alert, :created_at)');
            if (!$query->execute([
                'content' => $data['post'],
                'author' => $_SESSION['id'],
                'subject' => $subject,
                'alert' => 0,
                'created_at' => $date->format('Y-m-d H:i:s')
            ])) {
                return false;
            }
    
            return $pdo->lastInsertId();
        }

    Affichage du post grâce à une fonction :

    public function getCreatedAtWithTimeZone(): object 
    {
            return new DateTime($this->created_at, new DateTimeZone($_SESSION['timezone']));
    }

    $this->created_at contient la date du post sous le format :<small class="d-block mb-1rem" />

    2020-01-19 14:38:14

    Et session['timezone'] contient un fuseau horaire comme "Europe/Paris"

    Cependant la date retournée reste au format UTC, je ne comprends pas pourquoi :/

    Merci pour votre aide.



    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2020 à 19:43:35

      Bonjour,

      As-tu essayé de placer ceci juste avant ?

      date_default_timezone_set('Europe/Paris');



      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2020 à 19:49:12

        Salut,

        La time zone sert à définir l'heure courante/fuseau horaire. Le format UTC est un format standardisé d'ecriture de date, donc rien d'anormal :). J'imagine que tu cherches à avoir un format du genre Jour/Mois/Année. Dans ce cas il faut formater ta date : https://www.php.net/manual/fr/datetime.format.php

        -
        Edité par BeebleBrox 19 janvier 2020 à 19:49:57

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 janvier 2020 à 20:08:11

          Lort974 a écrit:

          Bonjour,

          As-tu essayé de placer ceci juste avant ?

          date_default_timezone_set('Europe/Paris');



          Cela ne change rien, j'ai fait :

          public function getCreatedAtWithTimeZone(): object 
          {   
                  
                  if (isset($_SESSION['timezone'])) {
                      $timezone = $_SESSION['timezone'];
                  } else {
                      $timezone = 'Europe/Paris';
                  }
          
                  dump($timezone);
                  
                  date_default_timezone_set($timezone);
                  return new DateTime($this->created_at);
          }

          Et que ce soit "Europe/Paris ou "Africa/Abidjan", cela m'affiche la même heure : 20h08 alors qu'il est 19h08 à Abidjan...

          BeebleBrox a écrit:

          Salut,

          La time zone sert à définir l'heure courante/fuseau horaire. Le format UTC est un format standardisé d'ecriture de date, donc rien d'anormal :). J'imagine que tu cherches à avoir un format du genre Jour/Mois/Année. Dans ce cas il faut formater ta date : https://www.php.net/manual/fr/datetime.format.php

          -
          Edité par BeebleBrox il y a 18 minutes

          Non je cherche à ce que la date retournée à l'utilisateur soit en adéquation avec son pays, donc qu'il lise l'heure exacte là où il est.

          -
          Edité par Anonyme 19 janvier 2020 à 20:13:04

          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2020 à 20:34:29

            Ok, au temps pour moi ^^

            Essai dans ce cas plutot de definir la timezone de ton objet DateTime au moment de son instanciation :

            public function getCreatedAtWithTimeZone(): object
            {  
                     
                    if (isset($_SESSION['timezone'])) {
                        $timezone = $_SESSION['timezone'];
                    } else {
                        $timezone = 'Europe/Paris';
                    }
                     
                    $date = new DateTime($this->created_at, new DateTimeZone($timezone));
            
                    return $date;
            }



            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              21 janvier 2020 à 11:57:37

              C'est ce que j'ai fait mais cela ne fonctionne pas... Ca marche pour les autres fuseaux horaires mais pour Paris cela m'indique 11h02 alors qu'il est 11h56 !

              Voilà comment je définis le timezone UTC que j'envoie en base de données :

              $date = new DateTime('now', new DateTimeZone('UTC'));

              Quelqu'un a une solution ? Merci.

              • Partager sur Facebook
              • Partager sur Twitter
                22 janvier 2020 à 22:41:56

                Salut,

                Il faut que tu donnes le type de fuseau horaire dans l'objet datetime comme ceci :

                $date1 = new DateTime("now", new DateTimeZone('Africa/Casablanca'));
                
                // retourne
                
                DateTime {#265 ▼
                  +"date": "2020-01-22 22:35:48.609529"
                  +"timezone_type": 3
                  +"timezone": "Africa/Casablanca"
                }
                
                
                $date2 = new DateTime("now", new DateTimeZone('Asia/Aqtobe'));
                
                
                // retourne
                
                DateTime {#260 ▼
                  +"date": "2020-01-23 02:35:48.609547" 
                  +"timezone_type": 3 
                  +"timezone": "Asia/Aqtobe"
                }
                
                
                $date3 = new DateTime("now", new DateTimeZone('Europe/Zurich'));
                
                // retourne  
                
                DateTime {#261 ▼
                  +"date": "2020-01-22 22:35:48.609564"
                  +"timezone_type": 3
                  +"timezone": "Europe/Zurich"
                }
                
                
                


                tu trouves la liste complête des fuseaux ici : https://www.php.net/manual/fr/timezones.php

                bon code !

                Daniel

                • Partager sur Facebook
                • Partager sur Twitter
                  23 janvier 2020 à 9:47:18

                  Ce que tu peux faire est d'obtenir le décalage horaire et faire le calcul avec DateTime::modify() , avec une date fixe ça ne fonctionnera pas en passant par new DateTime
                  • Partager sur Facebook
                  • Partager sur Twitter
                  le bienfait n'est jamais perdu
                  Anonyme
                    24 janvier 2020 à 13:08:41

                    Du coup j'ai mis NOW directement dans la requête d'ajout en base de données et je fais mes changements de fuseaux horaires lors de l'affichage à l'utilisateur, cela fonctionne normalement.

                    Merci !

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Gestion des heures

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown