Question

Y at-il un moyen simple de convertir un format de date dans 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 je bien sûr comme pour revenir une date plutôt que la fissure « o l'aube. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Le second paramètre à date() doit être un horodatage approprié (secondes depuis le 1er Janvier, 1970). Vous passez une chaîne, qui date () ne peut pas reconnaître.

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

PHP 5.3 et jusqu'à

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

PHP 5.2 et inférieur

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

Mais c'est beaucoup de travail! Je recommande d'utiliser un autre format que strftime () peut comprendre. strftime () comprend any entrée de date courte de 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);   

Autres conseils

La façon de faire est plus facile

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

Vous donnez d'abord ce format dateString $ est. Ensuite vous dites qu'il le format que vous voulez $ newDateString soit dans.

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

Si vous n'êtes pas transformaient d'un format de date à une autre, mais veulent juste la date (ou datetime) dans un format spécifique, il est encore plus facile:

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

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

Les bases

La façon simplist de convertir un format de date dans une autre est d'utiliser strtotime() avec date() . strtotime() convertit la date en Unix Timestamp . Ce Timestamp Unix peut alors être transmis à 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 doublure:

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

Gardez à l'esprit que strtotime() exige la date d'être dans un format valide . Le défaut de fournir un format valide entraînera strtotime() retour faux qui fera de votre date sera 1969-12-31.

Utilisation DateTime()

PHP 5.2, PHP offert DateTime() classe qui offre nous des outils plus puissants pour travailler avec des dates (et le temps). Nous pouvons réécrire le code ci-dessus en utilisant DateTime() comme ceci:

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

Travailler avec timestamp UNIX

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

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

DateTime () fonctionne avec des horodatages Unix en ajoutant un @ avant l'estampille temporelle:

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

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

  • Couper les trois derniers chiffres de l'aide substr()

parage les trois derniers chiffres peuvent être acheived plusieurs façons, mais en utilisant substr() est le plus facile:

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

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

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

Pour obtenir un timestamp Unix, vous pouvez utiliser strtotime() qui retourne un timestamp 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'option de formatage de la place U:

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

Travailler avec les formats de date non standard et ambiguës

Malheureusement pas toutes les dates que le développeur doit travailler avec sont dans un format standard. Heureusement PHP 5.3 nous a fourni une solution pour cela. DateTime::createFromFormat() nous permet de dire quel format PHP une chaîne de date est il peut être analysé 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 l'accès des membres de la classe sur instanciation a été ajoutée qui nous permet de transformer notre code DateTime() dans une seule 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');

Essayez ceci:

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

Pour convertir $date de dd-mm-yyyy hh:mm:ss à 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');
$old_date = date('y-m-d-h-i-s');       // works

vous faites mal ici, cela devrait être

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

séparateur de temps est ':'


Je pense que cela va aider ...

$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); 

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";

Vous devez convertir le OLD_DATE $ dans un horodatage, comme nécessite un horodatage comme second argument.

strtotime fonctionnera cela. les dates sont tout simplement pas les mêmes et tous en nous-format.

<?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 cette façon native vous aidera à convertir tous les formats entrées dans le 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);

Essayez ceci:

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

résolu pour moi,

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

Sortie: 18/04/2018

Ceci est l'autre façon, vous pouvez 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'; ?>

Juste en utilisant des chaînes, pour moi est une bonne solution, moins de problèmes avec MySQL. Détecte le format actuel et des modifications 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;
 }

USE

dateTranslator::translate($date, 'en')

Je sais que c'est vieux, mais, en cours d'exécution dans un fournisseur qui utilise de manière incompatible 5 formats de date différents dans leurs API (et les serveurs de test avec une variété de versions de PHP à partir des 5 années à travers les dernières 7 années), je décide d'écrire un convertisseur universel qui fonctionne avec une myriade de versions PHP.

Ce convertisseur prendra pratiquement toute entrée, y compris le format datetime standard (y compris avec ou sans millisecondes) et toute représentation temps Epoch (y compris avec ou sans millisecondes) et le convertir à pratiquement tout autre format .

Pour appeler:

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

Envoi nulle pour le format fera la fonction retourne le datetime dans Epoch / Unix Time. Dans le cas contraire, envoyer une chaîne de format cette date () prend en charge, ainsi qu'avec « .u » millisecondes (je manipule millisecondes ainsi, même si la date () retourne 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 des données de fuseau horaire (mais comme il est indiqué ci-dessus, à tout moment non GMT est retourné 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 pas dans cette version est la possibilité de sélectionner le fuseau horaire que vous voulez que le datetime retourné à être en. A l'origine, je l'ai écrit cela change tout datetime Epoch Time, donc, je ne l'ai pas besoin de temps de soutien de la zone . Il est trivial d'ajouter cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top