Frage

Gibt es einen einfachen Weg, um zu konvertieren ein Datum, das format in ein anderes Datum format in PHP?

Ich habe dieses:

$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 wieder einen aktuellen Datum eher als den crack o dawn.Was mache ich falsch?

War es hilfreich?

Lösung

Der zweite Parameter auf date() muss ein richtiger Zeitstempel sein (Sekunden seit dem 1. Januar 1970). Sie passieren eine Zeichenfolge, das Datum () kann nicht erkennen.

Sie können mit strtotime () ein Datum in einen Zeitstempel zu konvertieren. Aber auch strtotime () nicht das y-m-d-h-i-s Format erkennen.

PHP 5.3 und höher

Verwenden Sie DateTime::createFromFormat . Es ermöglicht Ihnen eine exakte Maske angeben - die date() Syntax -. Mit eingehenden Zeichenfolge Daten zu analysieren

PHP 5.2 und senken

Sie werden die Elemente analysieren müssen (Jahr, Monat, Tag, Stunde, Minute, Sekunde) manuell mit substr() und geben die Ergebnisse auf mktime () , dass Sie einen Zeitstempel bauen.

Aber das ist eine Menge Arbeit! Ich empfehle ein anderes Format verwenden, das strftime () verstehen. strftime () versteht jeder Datumseingabe kurz the next time joe will slip on the ice. zum Beispiel, das funktioniert:

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

Andere Tipps

Der einfachste Weg, dies zu tun ist

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

Sie zuerst das Format $ datestring zu geben ist. Dann sind Sie es, das Format erzählen Sie wollen $ newDateString in sein.

Dies vermeidet auch die Verwendung von strtotime, die Arbeit hart sein kann, mit manchmal.

Wenn Sie nicht von einem Datum Format in ein anderes verwandeln, wollen aber nur das aktuelle Datum (oder Datumzeit) in einem bestimmten Format dann 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: konvertiert Datumsformat yyyy-mm-dd => dd-mm-yyyy .

Die Grundlagen

Den einfachsten Weg, um zu konvertieren ein Datum, das format in ein anderes zu verwenden strtotime() mit date(). strtotime() konvertieren Sie das Datum in eine Unix-Timestamp.Unix-Zeitstempel kann dann weitergegeben werden date() konvertieren in das neue format.

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

Halten in Geist, dass strtotime() erfordert das Datum werden in einer gültig format.Das fehlen einer gültigen format führen strtotime() false zurückgeben, welche dazu führen, dass Ihr Datum 1969-12-31.

Verwendung DateTime()

PHP 5.2, PHP bot DateTime() Klasse bietet uns leistungsfähigere Werkzeuge zum arbeiten mit Datumsangaben (und Zeit).Wir schreiben den obigen code verwenden DateTime() wie so:

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

Arbeiten mit Unix-timestamps

date() nimmt ein Unix-timeatamp als zweiter parameter und gibt eine formatierte Datum für Sie:

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

DateTime() arbeitet mit Unix-timestamps, indem ein @ vor dem Zeitstempel:

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

Wenn der Zeitstempel in Millisekunden (es kann am Ende in 000 und/oder die Zeitstempel ist dreizehn Zeichen lang), müssen Sie konvertieren Sie es in Sekunden, bevor Sie umwandeln kann es in ein anderes format.Es gibt zwei Möglichkeiten, dies zu tun:

  • Schneiden Sie die letzten drei Ziffern aus, indem Sie substr()

Trimmen die letzten drei Ziffern werden kann, erreicht mehrere Möglichkeiten, aber mit substr() am einfachsten ist:

$timestamp = substr('1234567899000', -3);
  • Teilen Sie die substr-von 1000

Sie können auch konvertieren Sie timestamp in Sekunden geteilt durch 1000.Da der timestamp ist zu groß für 32 bit-Systeme Mathematik zu tun, werden Sie brauchen, um verwenden Sie die BCMath Bibliothek zu tun, die Mathematik als Zeichenfolgen:

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

Um einen Unix-Timestamp, die Sie verwenden können strtotime() das gibt einen Unix-Zeitstempel:

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

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

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

Wenn Sie PHP 5.2 können Sie die U option Formatierung statt:

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

Die Arbeit mit nicht-standard-und mehrdeutigen Datum-Formate

Leider sind noch nicht alle Termine fest, dass ein Entwickler hat, die arbeiten in einem standard-format.Glücklicherweise PHP 5.3 zur Verfügung gestellt uns mit, eine Lösung für, dass. DateTime::createFromFormat() erlaubt uns zu sagen, PHP welchem format ein Datum ein string ist, so kann es erfolgreich analysiert werden in ein DateTime-Objekt für die weitere Bearbeitung.

$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 wir die Fähigkeit erlangt zu tun in der Klasse Zugriff auf die Instanziierung wurde Hinzugefügt, die ermöglicht es uns, unser DateTime() code in einen one-liner:

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

Versuchen Sie diese:

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

Um $date von dd-mm-yyyy hh:mm:ss zu einem richtigen MySQL Datetime zu konvertieren Ich gehe wie folgt aus:

$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

Sie tun, ist hier falsch, sollte diese

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

Separator der Zeit ':'


ich denke, das helfen wird ...

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

Im Folgenden ist eine einfache Methode, Daten 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";

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

strtotime wird das funktionieren. die Daten sind einfach nicht das gleiche und alle in uns-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";
?>

Dieser native Weise wird dazu beitragen, jede 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);

Versuchen Sie diese:

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

Das ist für mich gelöst,

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

Ausgabe: 2018.04.18

Das ist die andere Art und 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'; ?>

Just Strings, für mich eine gute Lösung ist, weniger Probleme mit MySQL. Ermittelt das aktuelle Format und ändert sie bei Bedarf diese Lösung nur für Spanisch / Französisch Format und Englisch Format, ohne Verwendung PHP Datetime-Funktion.

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

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

Ich weiß, das ist alt, aber in einem Lieferanten in ausgeführt wird, die inkonsistent verwendet 5 verschiedene Datumsformate in ihre APIs (und Test-Server mit einer Vielzahl von PHP-Versionen von den 5 Jahren durch die letzten 7 Jahre), habe ich beschlossen, eine schreiben universal-Konverter, der mit einer Vielzahl von PHP-Versionen funktioniert.

Dieser Konverter nehmen praktisch jede Eingabe, einschließlich der Standard-Datetime-Format (einschließlich der mit oder ohne Millisekunden) und jeder Epoche Zeitdarstellung (einschließlich mit oder ohne Millisekunden) und wandelt es in praktisch jedem anderen Format .

nennen:

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

Senden von null für das Format wird die Funktion macht den Datetime in Epoch / Unix-Zeit zurück. Andernfalls sendet jedes Format String, date () unterstützt, sowie mit ".u" für Millisekunden (I Millisekunden verarbeiten als auch, obwohl date () kehren Nullen).

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 einige Beispiele für Anrufe - Sie werden feststellen, es übernimmt auch keine Zeitzonendaten (obwohl, wie oben erwähnt, jede nicht GMT-Zeit in Ihrer Zeitzone zurückgeführt 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 der Ausgang:

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 nicht in dieser Version ist die Möglichkeit, die Zeitzone wählen Sie die Datetime zurück in sein. Ursprünglich schrieb ich dies einen Datetime Epoch Zeit zu ändern, so habe ich nicht Unterstützung benötigen Zeitzone . Es ist trivial, obwohl hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top