Convertir un format de date en un autre en PHP

336

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 renvoie une date actuelle plutôt que l'aube du crack. Qu'est-ce que je fais mal?

À M
la source

Réponses:

293

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 y-m-d-h-i-sformat.

PHP 5.3 et supérieur

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

PHP 5.2 et inférieur

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

Mais ça fait beaucoup de travail! Je recommande d'utiliser un format différent que strftime () peut comprendre. strftime () comprend toute entrée de date avant 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);   
Pekka
la source
Merci Pekka, je viens de modifier ma question, j'ai essayé, mais cela ne semble pas fonctionner.
Tom
J'ai édité la réponse pendant que vous l'acceptiez :) J'ai ajouté quelques exemples et références supplémentaires.
Pekka
Gotcha, c'est bien le problème. C'est un nom de fichier fixe que je dois reconvertir en date (doit être dans ce format), donc je vais trouver une solution de contournement.
Tom
Remarque: Selon php.net DateTimeexiste depuis PHP 5.2 dans le noyau PHP et le support expérimental pour DateTimepeut être activé pour PHP 5.1 lors de la compilation. secure.php.net/manual/en/datetime.installation.php
Charlotte Dunois
108

La façon la plus simple de le faire est

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

Vous lui donnez d'abord le format $ dateString. Ensuite, vous lui indiquez le format dans lequel $ newDateString doit être.

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

Si vous ne passez pas d'un format de date à un autre, mais que vous voulez simplement la date actuelle (ou datetime) dans un format spécifique, c'est encore plus facile:

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

Cette autre question se réfère également au même sujet: Convertir le format de date aaaa-mm-jj => jj-mm-aaaa .

ceiroa
la source
Et comment est-ce un double si je pose la question avant celle à laquelle vous faites référence?
Tom
1
J'ai édité la réponse. Je voulais juste souligner que ces deux questions devraient être liées d'une manière ou d'une autre.
ceiroa
disponible en php 5.3+
Zorox
$timestring = $now->format('Y-m-d h:i:s');sûrement? mpendant des mois, ides minutes
Mark Baker
@madlopt ~ méthodes statiques: secure.php.net/manual/en/language.oop5.static.php
ceiroa
53

Les bases

La manière la plus simple de convertir un format de date en un autre est d'utiliser strtotime()avec date(). strtotime()convertira la date en horodatage Unix . Cet horodatage Unix peut ensuite être transmis pour date()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 en monoplace:

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

N'oubliez pas que strtotime()la date doit être dans un format valide . Si vous ne fournissez pas un format valide, le résultat sera strtotime()faux, ce qui entraînera la date du 31 décembre 1969.

En utilisant DateTime()

Depuis PHP 5.2, PHP offrait la DateTime()classe 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');

Travailler avec les horodatages Unix

date() prend un horodatage Unix comme deuxième paramètre et renvoie une date formatée pour vous:

$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 en millisecondes (il peut se terminer en 000et / ou l'horodatage est de treize caractères), vous devrez le convertir en secondes avant de pouvoir le convertir dans un autre format. Il y a deux façons de procéder:

  • Coupez les trois derniers chiffres avec substr()

Le découpage des trois derniers chiffres peut être obtenu de plusieurs manières, mais l'utilisation substr()est la plus simple:

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

Vous pouvez également convertir l'horodatage en secondes en divisant par 1000. Parce que l'horodatage est trop grand pour que les systèmes 32 bits fassent des calculs, vous devrez utiliser la bibliothèque BCMath pour effectuer les calculs sous forme de chaînes:

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

Pour obtenir un horodatage Unix, vous pouvez utiliser strtotime()ce 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 utilisez PHP 5.2, vous pouvez utiliser l' Uoption de formatage à 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 avec lesquelles un développeur doit travailler ne sont pas au format standard. Heureusement, PHP 5.3 nous a fourni une solution pour cela. DateTime::createFromFormat()nous permet de dire à PHP dans quel format une chaîne de date est 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');

En PHP 5.4, nous avons gagné la possibilité de faire un accès aux membres de la classe lors de l'instanciation, ce qui nous permet de transformer notre DateTime()code 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');
John Conde
la source
27

Essaye ça:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
Sarfraz
la source
Ne fonctionnera pas, strtotime () ne reconnaît pas le format. Je viens d'essayer.
Pekka
d'accord, je viens de mettre le code de format du questionneur, il devrait y avoir un format approprié spécifié.
Sarfraz
Ça a marché pour moi. Mon $ old_date était quelque chose comme ça 2012-05-22T19: 16: 37 + 01: 00. Merci d'ailleurs!
VishwaKumar
15

Convertir $date partir dd-mm-yyyy hh:mm:ssd'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');
Jelle de Fries
la source
4
Vous ne devez pas enchaîner ces méthodes sauf si vous êtes sûr à 110% que $ date est une date valide et correspond au format. Cela étant dit, une date non valide qui ne correspond pas exactement au format retourne: Fatal error: Call to a member function format() on a non-object. Juste un avertissement!
Half Crazed
Certes, une meilleure solution consiste à le faire en 3 étapes avec une vérification nulle comme étape intermédiaire.
Jelle de Fries
11

Ce qui suit est 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";
Peter
la source
10
$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); 

OU


$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); 
Rifat
la source
Oui, bien sûr, c'est un nom de fichier GUID que je veux reconvertir dans un format de date correct.
Tom
8

Cette méthode native aidera à convertir tout format saisi 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);
Nishad Up
la source
7

Vous devez reconvertir $ old_date en horodatage, car la fonction date requiert un horodatage comme deuxième argument.

John Parker
la source
7

strtotime s'en occupera. les dates ne sont tout simplement pas les mêmes et toutes au format américain.

<?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";
?>
de_nuit
la source
5

Essaye ça:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
vigne
la source
5

Cela a résolu pour moi,

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

Sortie: 2018-04-18

Ashokkumar C
la source
2

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'; ?>
Varun Malhotra
la source
1

Utiliser des chaînes, c'est pour moi une bonne solution, moins de problèmes avec mysql. Détecte le format actuel et le change si nécessaire, cette solution est uniquement pour le format espagnol / français et le format 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')
Alejandro Aranda
la source
1

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 teste des serveurs avec une variété de versions PHP des 5 aux 7 dernières), j'ai décidé d'écrire un convertisseur universel qui fonctionne avec une myriade de versions PHP.

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

Pour l'appeler:

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

L'envoi de null pour le format fera que la fonction retournera le datetime en Epoch / Unix Time. Sinon, envoyez n'importe quelle chaîne de format prise en charge par date (), ainsi qu'avec ".u" pour les millisecondes (je gère également les 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 non 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 la sortie:

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 le datetime retourné se trouve. Il est cependant trivial d'ajouter.

Robert Mauro
la source