web-dev-qa-db-fra.com

Convertir un format de date en un autre en PHP

Existe-t-il un moyen simple de convertir un format de date en un autre format de date en PHP?

J'ai ceci:

$old_date = date('y-m-d-h-i-s');            // works

$middle = strtotime($old_date);             // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00

Mais j’aimerais bien sûr qu’il retourne une date du jour plutôt que l’aube. Qu'est-ce que je fais mal?

295
Tom

Le deuxième paramètre à date() doit être un horodatage correct (secondes depuis le 1er janvier 1970). Vous passez une chaîne que date () ne peut pas reconnaître.

Vous pouvez utiliser strtotime () pour convertir une chaîne de date en horodatage. Cependant, même strtotime () ne reconnaît pas le format y-m-d-h-i-s.

PHP 5.3 et supérieur

Utilisez DateTime::createFromFormat . Il vous permet de spécifier un masque exact - en utilisant la syntaxe date() - avec lequel analyser les dates de chaîne entrantes.

PHP 5.2 et inférieur

Vous devrez analyser les éléments (année, mois, jour, heure, minute, seconde) à l'aide de substr() et remettre les résultats à mktime () qui vous construira un horodatage. 

Mais c'est beaucoup de travail! Je recommande d'utiliser un format différent que strftime () peut comprendre. strftime () comprend n'importe lequel la date entrée est inférieure à the next time joe will slip on the ice. par exemple, cela fonctionne:

$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);   
267
Pekka 웃

Le moyen le plus simple de le faire est

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');

Vous lui indiquez d’abord le format dans lequel $ dateString se trouve. Ensuite, vous lui indiquez le format souhaité pour $ newDateString.

Cela évite également l'utilisation de strtotime, qui peut parfois être difficile à utiliser.

Si vous ne passez pas d'un format de date à un autre, mais souhaitez simplement afficher la date actuelle (ou date/heure) dans un format spécifique, c'est encore plus simple:

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

Cette autre question concerne également le même sujet: Convertir le format de date aaaa-mm-jj => jj-mm-aaaa .

91
ceiroa

Les bases

La façon la plus simple de convertir un format de date en un autre consiste à utiliser strtotime() with date() . strtotime() convertira la date en Unix Timestamp . Cet horodatage Unix peut ensuite être passé à date() pour le convertir au nouveau format. 

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

Ou comme une ligne: 

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

N'oubliez pas que strtotime() exige que la date soit au format valide . Si vous ne fournissez pas un format valide, strtotime() retournera false, ce qui fera que votre date sera 1969-12-31.

Utilisation de DateTime()

À partir de PHP 5.2, PHP offrait la classe DateTime() qui nous offre des outils plus puissants pour travailler avec les dates (et l'heure). Nous pouvons réécrire le code ci-dessus en utilisant DateTime() comme suit:

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

Utilisation des horodatages Unix

date() prend un timeatamp Unix comme second paramètre et vous renvoie une date formatée:

$new_date_format = date('Y-m-d H:i:s', '1234567890');

DateTime () fonctionne avec les horodatages Unix en ajoutant un @ avant l'horodatage:

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

Si l'horodatage que vous avez est exprimé en millisecondes (il peut se terminer par 000 et/ou s'il comporte 13 caractères), vous devrez le convertir en secondes avant de pouvoir le convertir en un autre format. Il y a deux façons de faire ceci:

  • Coupez les trois derniers chiffres en utilisant substr()

Il est possible de couper les trois derniers chiffres de plusieurs manières, mais utiliser substr() est le plus simple:

$timestamp = substr('1234567899000', -3);
  • Diviser le substrat par 1000

Vous pouvez également convertir l’horodatage en secondes en divisant par 1000. Comme l’horodatage est trop volumineux pour que les systèmes 32 bits fassent des calculs, vous devrez utiliser la bibliothèque BCMath pour les calculer en tant que chaînes:

$timestamp = bcdiv('1234567899000', '1000');

Pour obtenir un horodatage Unix, vous pouvez utiliser strtotime() qui renvoie un horodatage Unix:

$timestamp = strtotime('1973-04-18');

Avec DateTime (), vous pouvez utiliser DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();

Si vous exécutez PHP 5.2, vous pouvez utiliser l'option de formatage U à la place:

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

Utilisation de formats de date non standard et ambigus 

Malheureusement, toutes les dates auxquelles un développeur doit travailler ne sont pas dans un format standard. Heureusement PHP 5.3 nous a fourni une solution à cela. DateTime::createFromFormat() nous permet de dire PHP le format d'une chaîne de date afin qu'elle puisse être analysée avec succès dans un objet DateTime pour une manipulation ultérieure.

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');

Dans PHP 5.4, nous avons acquis la possibilité de faire un accès membre à la classe lors de l’instanciation, ce qui nous permet de transformer notre code DateTime() en une ligne:

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
43
John Conde

Essaye ça:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
26
Sarfraz

Pour convertir $date de dd-mm-yyyy hh:mm:ss en un datetime MySQL approprié .__, je vais comme ceci:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
13
Jelle de Fries
$old_date = date('y-m-d-h-i-s');       // works

vous vous trompez ici, cela devrait être

$old_date = date('y-m-d h:i:s');       // works

le séparateur de temps est ':'


Je pense que ça aidera...

$old_date = date('y-m-d-h-i-s');              // works

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time); 

OR


$old_date = date('y-m-d-h-i-s');              // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time); 
9
Rifat

Voici une méthode simple pour convertir des dates en différents formats.

// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";
9
Peter

Vous devez reconvertir $ old_date en un horodatage, car la fonction date nécessite un horodatage comme second argument.

6
John Parker

strtotime va résoudre ce problème. les dates ne sont tout simplement pas les mêmes et toutes au format US.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
6
de_nuit

Cette manière native aidera à convertir tout format entré au format souhaité.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
4
Nishad Up

Essaye ça:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
4
vineet

Cela a résolu pour moi,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Sortie: 2018-04-18

4
Arthi Rajgopal

C’est l’autre façon de convertir le format de date

 <?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>
1
Varun Malhotra

Je sais que c'est vieux, mais, en rencontrant un fournisseur qui utilise de manière incohérente 5 formats de date différents dans leurs API (et des serveurs de test avec une variété de versions PHP des 5 à 7), j'ai décidé d'écrire un convertisseur universel qui fonctionne avec une multitude de versions PHP. 

Ce convertisseur prend pratiquement n'importe quelle entrée, y compris tout format de date/heure standard (y compris avec ou sans millisecondes) et toute représentation Epoch Time (y compris avec ou sans millisecondes) et la convertit dans pratiquement tout autre format. 

Pour l'appeler:

$TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);

L'envoi de la valeur null pour le format fera que la fonction retourne la date/heure dans Epoch/Unix Time. Sinon, envoyez n'importe quelle chaîne de format prise en charge par date (), ainsi que ".u" pendant des millisecondes (je traite également des millisecondes, même si date () renvoie des zéros).

Voici le code:

        <?php   
        function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
        {
            if (!isset($dttm))
            {
                return "";
            }
            $timepieces = array();
            if (is_numeric($dttm))
            {
                $rettime=$dttm;
            }
            else
            {
                $rettime=strtotime($dttm);
                if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                {
                    $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                    $timepieces[1]="";
                }
                else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                {               
                    preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                    $rettime=$rettime.".".$timepieces[1];
                }
            }

            if (isset($dtFormat))
            {
                // RETURN as ANY date format sent
                if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                {
                    $rettime=date($dtFormat,$rettime);              
                    $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                }
                else                                // NO milliseconds wanted
                {
                    $rettime=date($dtFormat,$rettime);
                }
            }
            else
            {
                // RETURN Epoch Time (do nothing, we already built Epoch Time)          
            }
            return $rettime;    
        }
    ?>

Voici quelques exemples d’appels - vous remarquerez qu’il gère également toutes les données de fuseau horaire (bien que, comme indiqué ci-dessus, toute heure autre que GMT soit renvoyée dans votre fuseau horaire). 

        $utctime1="2018-10-30T06:10:11.2185007-07:00";
        $utctime2="2018-10-30T06:10:11.2185007";
        $utctime3="2018-10-30T06:10:11.2185007 PDT";
        $utctime4="2018-10-30T13:10:11.2185007Z";
        $utctime5="2018-10-30T13:10:11Z";
        $dttm="10/30/2018 09:10:11 AM EST";

        echo "<pre>";
        echo "<b>Epoch Time to a standard format</b><br>";
        echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
        echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
        echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
        echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
        echo "</b><br>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
        echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
        echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
        echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
        echo "<hr>";
        echo "<hr>";
        echo "<b>Returned as whatever datetime format one desires</b>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<p><b>Returned as ISO8601</b>";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
        echo "</pre>";

Voici le résultat:

Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11

Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)

UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
Returned as whatever datetime format one desires
UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
Returned as ISO8601
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601

La seule chose qui ne se trouve pas dans cette version est la possibilité de sélectionner le fuseau horaire dans lequel vous voulez que la date/heure retournée soit. À l'origine, j'avais écrit ceci pour changer n'importe quelle date en Epoch Time, je n'avais donc pas besoin de la prise en charge des fuseaux horaires. C'est trivial d'ajouter cependant. 

0
Robert Mauro

Juste utiliser des chaînes, pour moi est une bonne solution, moins de problèmes avec mysql. Détecte le format actuel et le modifie si nécessaire. Cette solution est uniquement pour les formats espagnol/français et anglais, sans utiliser la fonction php datetime.

class dateTranslator {

 public static function translate($date, $lang) {
      $divider = '';

      if (empty($date)){
           return null;   
      }
      if (strpos($date, '-') !== false) {
           $divider = '-';
      } else if (strpos($date, '/') !== false) {
           $divider = '/';
      }
      //spanish format DD/MM/YYYY hh:mm
      if (strcmp($lang, 'es') == 0) {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 4) {
                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '-') == 0) {
                $date = str_replace("-", "/", $date);
           }
      //english format YYYY-MM-DD hh:mm
      } else {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 2) {

                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '/') == 0) {
                $date = str_replace("/", "-", $date);

           }   
      }
      return $date;
 }

 public static function reverseDate($date) {
      $date2 = explode(' ', $date);
      if (count($date2) == 2) {
           $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
      } else {
           $date = implode("-", array_reverse(preg_split("/\D/", $date)));
      }

      return $date;
 }

UTILISATION

dateTranslator::translate($date, 'en')
0
Alejandro Aranda