wake-up-neo.net

Konvertieren Sie ein Datumsformat in ein anderes in PHP

Gibt es eine einfache Möglichkeit, ein Datumsformat in ein anderes Datumsformat in PHP 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 würde natürlich gerne ein aktuelles Datum und nicht das Morgengrauen zurückgeben. Was mache ich falsch?

295
Tom

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

Sie können strtotime () verwenden, um eine Datumszeichenfolge in einen Zeitstempel umzuwandeln. Allerdings erkennt auch strtotime () das y-m-d-h-i-s-Format nicht.

PHP 5.3 und höher

Verwenden Sie DateTime::createFromFormat . Sie können mit der Syntax date() eine exakte Maske angeben, um eingehende String-Daten mit zu parsen.

PHP 5.2 und niedriger

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

Aber das ist viel Arbeit! Ich empfehle, ein anderes Format zu verwenden, das strftime () verstehen kann. strftime () versteht any Datumseingabe kurz 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);   
267
Pekka 웃

Der einfachste Weg dies zu tun ist

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

Zuerst geben Sie das Format an, in dem $ dateString vorliegt. Dann teilen Sie ihm das Format mit, in dem $ newDateString angezeigt werden soll.

Dies vermeidet auch die Verwendung von strtotime, was manchmal schwierig sein kann.

Wenn Sie nicht von einem Datumsformat in ein anderes umwandeln, sondern nur das aktuelle Datum (oder die Datumszeit) in einem bestimmten Format haben möchten, ist es noch einfacher:

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

Diese andere Frage bezieht sich auch auf das gleiche Thema: Datumsformat konvertieren JJJJ-MM-TT => TT-MM-JJJJ .

91
ceiroa

Die Grundlagen

Die einfachste Möglichkeit, ein Datumsformat in ein anderes zu konvertieren, ist strtotime() mit date() . strtotime() konvertiert das Datum in einen Unix-Zeitstempel . Dieser Unix-Zeitstempel kann dann an date() übergeben werden, 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 One-Liner: 

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

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

Verwenden von DateTime()

Ab PHP 5.2 bot PHP die Klasse DateTime() an, die uns leistungsfähigere Werkzeuge für die Arbeit mit Datumsangaben (und Zeit) bietet. Wir können den obigen Code mit DateTime() so umschreiben:

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

Mit Unix-Zeitstempeln arbeiten

date() nimmt einen Unix-Timeatamp 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 () arbeitet 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 der Zeitstempel in Millisekunden liegt (er kann in 000 enden und/oder der Zeitstempel ist dreizehn Zeichen lang), 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 substr() ab.

Das Zuschneiden der letzten drei Ziffern kann auf verschiedene Weise erfolgen, die Verwendung von substr() ist jedoch am einfachsten:

$timestamp = substr('1234567899000', -3);
  • Teilen Sie das substr 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 rechnen zu können, müssen Sie die Bibliothek BCMath verwenden, um die Mathematik als Zeichenfolgen auszuführen:

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

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

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

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

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

Wenn Sie PHP 5.2 ausführen, können Sie stattdessen die Formatierungsoption U 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 lieferte uns PHP 5.3 eine Lösung dafür. Mit DateTime::createFromFormat() können wir PHP mitteilen, in welchem ​​Format sich eine Datumszeichenfolge befindet, damit sie zur weiteren Bearbeitung erfolgreich in ein DateTime-Objekt zerlegt 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, den Zugriff auf Mitglieder für Instantiierung zu ermöglichen. Dies ermöglicht es uns, unseren DateTime()-Code in einen Einzeiler zu verwandeln:

$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

Versuche dies:

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

Um $date von dd-mm-yyyy hh:mm:ss in eine korrekte MySQL-Datetime zu konvertieren.

$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

sie machen hier falsch, das sollte sein

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

trennzeichen der Zeit 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); 

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

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

Sie müssen $ old_date zurück in einen Zeitstempel konvertieren, da die Funktion date als zweiten Argument einen Zeitstempel erfordert.

6
John Parker

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";
?>
6
de_nuit

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);
4
Nishad Up

Versuche dies:

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

Das löste sich für mich,

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

Ausgabe: 2018-04-18

4
Arthi Rajgopal

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

Ich weiß, das ist alt, aber als ich auf einen Anbieter traf, der inkonsistent 5 verschiedene Datumsformate in seinen APIs (und Testservern mit einer Vielzahl von PHP -Versionen von 5 bis 7) verwendet, entschied ich mich zu schreiben Ein universeller Konverter, der mit einer Vielzahl von PHP Versionen arbeitet. 

Dieser Konverter nimmt praktisch jede Eingabe auf, einschließlich jedes Standard-Zeitformats (einschließlich mit oder ohne Millisekunden) und einer beliebigen Epoch-Time-Darstellung (einschließlich mit oder ohne Millisekunden), und konvertiert sie in praktisch jedes andere Format. 

Um es anzurufen:

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

Wird für das Format Null gesendet, gibt die Funktion die Datumszeit in Epoch/Unix-Zeit zurück. Senden Sie andernfalls einen Format-String, der von date () unterstützt wird, sowie mit ".u" für Millisekunden (ich kann auch Millisekunden verarbeiten, 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 Beispielanrufe - Sie werden auch feststellen, dass auch Zeitzonen-Daten verarbeitet werden (obwohl, wie oben erwähnt, in der Zeitzone keine GMT-Zeit 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 möglich ist, ist die Möglichkeit, die Zeitzone auszuwählen, in der die zurückgegebene Datumszeit liegen soll. Ursprünglich habe ich dieses geschrieben, um eine beliebige Datumszeit in Epoch Time zu ändern, also brauchte ich keine Zeitzonenunterstützung. Es ist trivial, aber hinzuzufügen. 

0
Robert Mauro

Nur mit Strings zu arbeiten, 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 spanische/französische Format und das englische Format verfügbar, ohne dass die PHP-Zeitfunktion verwendet wird.

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

BENUTZEN

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