Konvertieren Sie ein Datumsformat in ein anderes in PHP

336

Gibt es eine einfache Möglichkeit, ein Datumsformat in PHP in ein anderes Datumsformat zu konvertieren?

Ich habe das:

$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

Aber ich möchte natürlich, dass es ein aktuelles Datum zurückgibt und nicht den Morgengrauen. Was mache ich falsch?

Tom
quelle

Antworten:

293

Der zweite Parameter date()muss ein korrekter Zeitstempel sein (Sekunden seit dem 1. Januar 1970). Sie übergeben eine Zeichenfolge, die date () nicht erkennen kann.

Mit strtotime () können Sie eine Datumszeichenfolge in einen Zeitstempel konvertieren. Selbst strtotime () erkennt das y-m-d-h-i-sFormat jedoch nicht .

PHP 5.3 und höher

Verwenden Sie DateTime::createFromFormat. Sie können mithilfe der date()Syntax eine genaue Maske angeben, mit der eingehende Zeichenfolgendaten analysiert werden sollen.

PHP 5.2 und niedriger

Sie müssen die Elemente (Jahr, Monat, Tag, Stunde, Minute, Sekunde) manuell analysierensubstr() und die Ergebnisse an mktime () übergeben. , um einen Zeitstempel .

Aber das ist viel Arbeit! Ich empfehle die Verwendung eines anderen Formats, das strftime () verstehen kann. strftime () versteht jede Datumseingabe kurz vor the next time joe will slip on the ice. Das funktioniert zum Beispiel:

$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
quelle
Danke Pekka, habe gerade meine Frage bearbeitet, habe das versucht, aber es scheint nicht zu funktionieren.
Tom
Ich habe die Antwort bearbeitet, während Sie sie akzeptiert haben :) Ich habe einige weitere Beispiele und Referenzen hinzugefügt.
Pekka
Gotcha, das ist in der Tat das Problem. Es ist ein fester Dateiname, den ich zurück in ein Datum konvertieren muss (muss in diesem Format sein), also werde ich eine Problemumgehung finden.
Tom
Hinweis: Laut php.net DateTimegibt es seit PHP 5.2 im PHP-Kern und experimentelle Unterstützung DateTimefür PHP 5.1 kann beim Kompilieren aktiviert werden. Secure.php.net/manual/en/datetime.installation.php
Charlotte Dunois
108

Der einfachste Weg, dies zu tun, ist

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

Sie geben ihm zuerst das Format $ dateString. Dann teilen Sie ihm das Format mit, in dem $ newDateString sein soll.

Dies vermeidet auch die Verwendung von strtotime, mit der manchmal schwer zu arbeiten sein kann.

Wenn Sie nicht von einem Datumsformat in ein anderes wechseln, sondern nur das aktuelle Datum (oder die aktuelle Uhrzeit) in einem bestimmten Format anzeigen möchten, ist dies noch einfacher:

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

Diese andere Frage bezieht sich ebenfalls auf dasselbe Thema: Konvertieren des Datumsformats JJJJ-MM-TT => TT-MM-JJJJ .

Ceiroa
quelle
Und wie ist es ein Duplikat, wenn ich die Frage vor der Frage gestellt habe, auf die Sie sich beziehen?
Tom
1
Ich habe die Antwort bearbeitet. Ich wollte nur darauf hinweisen, dass diese beiden Fragen irgendwie miteinander verbunden sein sollten.
Ceiroa
verfügbar in php 5.3+
Zorox
$timestring = $now->format('Y-m-d h:i:s');sicherlich? mseit Monaten, ifür Minuten
Mark Baker
@madlopt ~ statische Methoden: Secure.php.net/manual/en/language.oop5.static.php
Ceiroa
53

Die Grundlagen

Die einfachste Möglichkeit, ein Datumsformat in ein anderes zu konvertieren, ist die Verwendung strtotime()mit date(). strtotime()konvertiert das Datum in einen Unix-Zeitstempel . Dieser Unix-Zeitstempel kann dann übergeben werden date(), um ihn in das neue Format zu konvertieren.

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

Oder als Einzeiler:

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

Beachten Sie, strtotime()dass das Datum in einem gültigen Format vorliegen muss . Wenn Sie kein gültiges Format strtotime()angeben, wird false zurückgegeben, und Ihr Datum lautet 1969-12-31.

Verwenden von DateTime()

Ab PHP 5.2 bot PHP die DateTime()Klasse an, die uns leistungsfähigere Tools für die Arbeit mit Datum (und Uhrzeit) bietet. Wir können den obigen Code folgendermaßen umschreiben DateTime():

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

Arbeiten mit Unix-Zeitstempeln

date() Nimmt einen Unix-Zeitstempel als zweiten Parameter und gibt ein formatiertes Datum für Sie zurück:

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

DateTime () funktioniert mit Unix-Zeitstempeln, indem @vor dem Zeitstempel ein hinzugefügt wird :

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

Wenn Ihr Zeitstempel in Millisekunden angegeben ist (er kann enden 000und / oder der Zeitstempel dreizehn Zeichen lang ist), müssen Sie ihn in Sekunden konvertieren, bevor Sie ihn in ein anderes Format konvertieren können. Es gibt zwei Möglichkeiten, dies zu tun:

  • Schneiden Sie die letzten drei Ziffern mit ab substr()

Das Trimmen der letzten drei Ziffern kann auf verschiedene Arten erreicht werden. Die Verwendung substr()ist jedoch am einfachsten:

$timestamp = substr('1234567899000', -3);
  • Teilen Sie den Teil durch 1000

Sie können den Zeitstempel auch in Sekunden umwandeln, indem Sie ihn durch 1000 teilen. Da der Zeitstempel für 32-Bit-Systeme zu groß ist, um Berechnungen durchzuführen , müssen Sie die BCMath- Bibliothek verwenden, um die Berechnungen als Zeichenfolgen durchzuführen :

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

Um einen Unix-Zeitstempel zu erhalten, können Sie strtotime()einen Unix-Zeitstempel zurückgeben:

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

Mit DateTime () können Sie verwenden DateTime::getTimestamp()

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

Wenn Sie PHP 5.2 ausführen, können Sie Ustattdessen die Formatierungsoption verwenden:

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

Arbeiten mit nicht standardmäßigen und mehrdeutigen Datumsformaten

Leider haben nicht alle Daten, mit denen ein Entwickler arbeiten muss, ein Standardformat. Glücklicherweise hat uns PHP 5.3 eine Lösung dafür geliefert. DateTime::createFromFormat()Ermöglicht es uns, PHP mitzuteilen, in welchem ​​Format eine Datumszeichenfolge vorliegt, damit sie zur weiteren Bearbeitung erfolgreich in ein DateTime-Objekt analysiert werden kann.

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

In PHP 5.4 haben wir die Möglichkeit erhalten, bei Instanziierung auf Klassenmitglieder zuzugreifen. Dadurch wurde unser DateTime()Code in einen Einzeiler umgewandelt:

$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
quelle
27

Versuche dies:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
Sarfraz
quelle
Funktioniert nicht, strtotime () erkennt das Format nicht. Gerade versucht.
Pekka
vereinbart, ich habe gerade den Formatcode vom Fragesteller eingegeben, es sollte das richtige Format angegeben werden.
Sarfraz
Es hat bei mir funktioniert. Mein $ old_date war so etwas wie dieses 2012-05-22T19: 16: 37 + 01: 00. Danke übrigens!
VishwaKumar
15

Um $datevon dd-mm-yyyy hh:mm:sseiner richtigen MySQL-Datumszeit zu konvertieren , gehe ich folgendermaßen vor:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
Jelle de Fries
quelle
4
Sie sollten diese Methoden nur verketten, wenn Sie zu 110% sicher sind, dass $ date ein gültiges Datum ist und zum Format passt. Wenn dies gesagt wird, wird ein ungültiges Datum zurückgegeben, das nicht genau dem Format entspricht : Fatal error: Call to a member function format() on a non-object. Nur ein Kopf hoch!
Half Crazed
Richtig, eine bessere Lösung besteht darin, dies in drei Schritten mit einer Nullprüfung als mittlerem Schritt zu tun.
Jelle de Fries
11

Das Folgende ist eine einfache Methode, um Datumsangaben in verschiedene Formate zu konvertieren.

// 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
quelle
10
$old_date = date('y-m-d-h-i-s');       // works

du machst hier falsch, das sollte sein

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

Zeittrennzeichen ist ':'


Ich denke das wird helfen ...

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

ODER


$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
quelle
Ja, sicher, danke, es ist ein GUID-Dateiname, den ich wieder in ein korrektes Datumsformat konvertieren möchte.
Tom
8

Diese native Methode hilft dabei, jedes eingegebene Format in das gewünschte Format zu konvertieren.

$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
quelle
7

Sie müssen die $ OLD_DATE zurück in einen Zeitstempel konvertieren, da die Datumsfunktion einen Zeitstempel als zweites Argument erfordert.

John Parker
quelle
7

strtotime wird das klären. Die Daten sind einfach nicht gleich und alle im US-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_nuit
quelle
5

Versuche dies:

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

Das hat sich für mich gelöst,

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

Ausgabe: 2018-04-18

Ashokkumar C.
quelle
2

Auf diese Weise können Sie das Datumsformat konvertieren

 <?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
quelle
1

Nur Strings zu verwenden, ist für mich eine gute Lösung, weniger Probleme mit MySQL. Erkennt das aktuelle Format und ändert es bei Bedarf. Diese Lösung ist nur für das spanisch / französische Format und das englische Format geeignet, ohne die PHP-Datetime-Funktion zu verwenden.

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

VERWENDEN

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

Ich weiß, dass dies alt ist, aber als ich auf einen Anbieter stieß, der uneinheitlich 5 verschiedene Datumsformate in seinen APIs verwendet (und Testserver mit einer Vielzahl von PHP-Versionen von den 5ern bis zu den neuesten 7ern), entschied ich mich, einen universellen Konverter zu schreiben, der funktioniert mit einer Vielzahl von PHP-Versionen.

Dieser Konverter nimmt praktisch jede Eingabe auf, einschließlich eines Standard-Datums- / Uhrzeitformats (einschließlich mit oder ohne Millisekunden) und einer Epochenzeitdarstellung (einschließlich mit oder ohne Millisekunden), und konvertiert sie in praktisch jedes andere Format.

Um es zu nennen:

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

Wenn Sie für das Format null senden, gibt die Funktion die Datums- und Uhrzeitangabe in Epoch / Unix Time zurück. Andernfalls senden Sie eine von date () unterstützte Formatzeichenfolge sowie ".u" für Millisekunden (ich verarbeite auch Millisekunden, obwohl date () Nullen zurückgibt).

Hier ist der 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;    
        }
    ?>

Hier sind einige Beispielaufrufe - Sie werden feststellen, dass auch alle Zeitzonendaten verarbeitet werden (obwohl, wie oben erwähnt, jede Nicht-GMT-Zeit in Ihrer Zeitzone zurückgegeben wird).

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

Hier ist die Ausgabe:

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

Das einzige, was in dieser Version nicht enthalten ist, ist die Möglichkeit, die Zeitzone auszuwählen, in der sich die zurückgegebene Datumszeit befinden soll. Ursprünglich habe ich dies geschrieben, um die Datums- und Uhrzeitangabe in Epochenzeit zu ändern, sodass ich keine Zeitzonenunterstützung benötigte. Es ist jedoch trivial hinzuzufügen.

Robert Mauro
quelle