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?
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);
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 .
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:
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);
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');
Versuche dies:
$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
in eine korrekte MySQL-Datetime zu konvertieren.
$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 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);
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";
Sie müssen $ old_date zurück in einen Zeitstempel konvertieren, da die Funktion date als zweiten Argument einen Zeitstempel erfordert.
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";
?>
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);
Versuche dies:
$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
Das löste sich für mich,
$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;
Ausgabe: 2018-04-18
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'; ?>
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.
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')