Konvertieren Sie mit PHP von MySQL datetime in ein anderes Format

447

Ich habe eine datetimeSpalte in MySQL.

Wie kann ich es mit PHP als MM / TT / JJ H: M (AM / PM) in das Display konvertieren ?

Tim Boland
quelle
4
Wir müssen wissen, wie das Datum in SQL gespeichert wird. Ist es Zeitstempel oder Datetime oder Unixtime?
Ólafur Waage
Sie werden nicht in Unix-Zeit gespeichert, genau wie ein normales Datum. PHP ist derjenige, der sie als Sekunden und so behandelt. Ich würde Ihnen empfehlen, die PHP- OOPDatetime-Funktionen zu verwenden, sie sind sehr einfach zu bedienen.
Gucho Ca
2
Kann ich eine Alternative zu Ihrem Datumsformat empfehlen? mm/dd/yyist sehr amerikanisch, und diejenigen von uns, die in anderen Teilen der Welt leben, werden mehr als ein wenig gereizt, wenn sie versuchen, zu erraten, was damit gemeint ist 11-12-13. Der universellere Standard ist yyyy-mm-ddund ist Teil des ISO 8601-Standards. Gelingt das nicht , sollten Sie den Monat verwenden Namen , nicht die Anzahl.
Manngo

Antworten:

515

Wenn Sie nach einer Möglichkeit suchen, ein Datum im MySQL-Format zu normalisieren, verwenden Sie Folgendes

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

Die Zeile $phpdate = strtotime( $mysqldate )akzeptiert eine Zeichenfolge und führt eine Reihe von Heuristiken durch, um diese Zeichenfolge in einen Unix-Zeitstempel umzuwandeln.

Die Zeile $mysqldate = date( 'Y-m-d H:i:s', $phpdate )verwendet diesen Zeitstempel und die PHP- dateFunktion, um diesen Zeitstempel wieder in das Standard-Datumsformat von MySQL umzuwandeln.

( Anmerkung des Herausgebers : Diese Antwort stammt aus einer ursprünglichen Frage mit verwirrendem Wortlaut und der allgemeinen Nützlichkeit von Google, die diese Antwort bietet, auch wenn sie die jetzt vorhandene Frage nicht direkt beantwortet.)

kta
quelle
19
Diese Antwort verwirrt das Thema
Alex K
5
@ 0xBAADF00D: Bitte lesen Sie die Frage noch einmal ... niemand fragte nach dem MySQL-Standardformat.
user7116
3
Natürlich, aber wenn Standard vorhanden ist, kann es hilfreich sein, dem Standard zu folgen (es vermeidet später Kopfschmerzen, wenn ein anderer Entwickler an Ihrem Code arbeitet) xD
0xBAADF00D
4
Die Frage fordert zur Ausgabe im Format MM / TT / JJ H: M (AM / PM), nicht "Ymd H: i: s".
Rikki
6
does not workfür wen? Die akzeptierte Antwort funktioniert, wenn Sie wie gewünscht von MySQL in MM / TT / JJ H: M (AM / PM) konvertieren möchten . Nur weil Sie das Gegenteil tun möchten, wird eine akzeptierte Antwort nicht falsch gemacht.
Toxalot
311

So konvertieren Sie ein von MySQL abgerufenes Datum in das angeforderte Format ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Informationen zum Anpassen des Formats finden Sie in den PHP-Datumsformatierungsoptionen .

Tim Boland
quelle
Woher soll dieses $rowObjekt kommen?
Mike
25
Ich könnte mich irren, aber ich denke, einige von Ihnen verpassen den Punkt. Er möchte, dass die Ausgabe im Format "m / d / yg: i A" erfolgt und das ursprüngliche Datum aus einem DATETIME-Feld abgerufen wird. Also funktioniert sein Code. @Mike $ row-> createdate ist nur Tims datetime-Spalte.
Bloße Entwicklung
4
Die Antwort von @AsTeR ist nur verwirrend, wenn Sie die Frage falsch verstanden haben. OP hat seine eigene Frage beantwortet und möchte ein Datum von MySQL nehmen und in das gewünschte Format ausgeben: MM / TT / JJ H: M (AM / PM) .
Toxalot
@ TimBoland Ich denke, die Antwort könnte verbessert werden, wenn von sowie das angeforderte Format MM / TT / JJ H: M (AM / PM) hervorgehoben würden . Und es könnte von einem Link zur Datumsfunktion profitieren. Ich habe versucht, eine Bearbeitung vorzuschlagen , diese wurde jedoch abgelehnt.
Toxalot
1
Unterhaltsame Tatsache: Diese Antwort entspricht in etwa der unten stehenden (die praktisch keine Downvotes enthält), hat jedoch> 40 Downvotes, da sie die Frage des OP beantwortet, die sich von der Frage unterscheidet, die die Leute auf dieser Seite tatsächlich haben.
Clément
110

Wenn Sie PHP 5 verwenden, können Sie es auch versuchen

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
quelle
Wie oben in den Kommentaren angegeben, ist das Standardformat("Y-m-d H:i:s")
Yannickv
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Referenz: http://php.net/manual/en/function.date.php

Tony Stark
quelle
Ich denke, die Leute stimmen ab, weil sie über die OP-Frage verwirrt sind. Die meisten lesen die Frage als das Gegenteil von dem, was sie tatsächlich ist. Die andere Möglichkeit ist, dass dies der akzeptierten Antwort, die vor mehr als 5 Jahren veröffentlicht wurde, sehr ähnlich ist.
Toxalot
1
Der Link, auf den Sie verweisen, verweist weder auf die von Ihnen verwendete Funktion noch erklärt er das Format. Ich denke, php.net/function.date.php wäre besser.
Toxalot
@toxalot Die akzeptierte Antwort ist falsch. Es wurde nach meiner Antwort und über meinen Link bearbeitet. Ich ersetze Ihren Link. Vielen Dank
Tony Stark
1
Diese ganze Frage und Antwort hat eine schmutzige Geschichte. Die akzeptierte Antwort war zwischen dem 29. April 2013 und dem 24. Mai 2013 falsch. Sie war korrekt, als Sie Ihre Antwort zum ersten Mal veröffentlicht haben. Ihre Antwort war bis zum 29. Mai 2013 falsch. Danach wurde sie der akzeptierten Antwort sehr ähnlich.
Toxalot
23

Endlich die richtige Lösung für PHP 5.3 und höher: (Optionale Zeitzone zum Beispiel hinzugefügt, wie in den Kommentaren erwähnt)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
quelle
sein Fehler .. Klasse 'App \ Controller \ DateTime' nicht gefunden .. using PHP 6.4
aswzen
1
Wenn Sie in einem anderen Namespace arbeiten, müssen Sie ihn mit einem Backslash davor \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
aufrufen
2
Vergessen Sie nicht, die Zeitzone anzugeben, wenn Sie Ihr Datumsobjekt erstellen! Andernfalls kann es sein, dass Ihr formatiertes Datum mehrere Stunden entfernt ist. Ihre datetimeSpalten sollten UTF8 sein. Übergeben Sie sie daher new DateTimeZone('UTC')als dritten Parameter, um sicherzustellen, dass PHP dies weiß.
Eric Seastrand
Dies ist die richtige Antwort, die das gewünschte Format des OP ausgibt. Achten Sie einfach auf die Zeitzonen
Buchhalter م
12

Eine einfachere Möglichkeit wäre, das Datum direkt in der MySQL-Abfrage anstelle von PHP zu formatieren. Siehe den manuellen MySQL-Eintrag für DATE_FORMAT .

Wenn Sie lieber es in PHP tun würden, dann müssen Sie das Datum Funktion, aber Sie werden Ihren Datenbank - Wert in einen Zeitstempel zuerst konvertieren.

Blitz
quelle
11
-1, da das Formatierungsdatum in der Datenbank keine gute Idee ist. Mehrsprachiges Web benötigt unterschiedliche Datumsformate und dann müssen Sie das Datum in PHP formatieren (gemeinsame Geschäftslogiksprache). Wenn Sie über dateFunktion geschrieben haben, sollten Sie auch über strottimeFunktion schreiben, um jemandem zu helfen, anstatt "aber Sie müssen zuerst Ihren Datenbankwert in einen Zeitstempel konvertieren".
Boris Šuška
10

Vergiss alles. Benutz einfach:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
Nixis
quelle
9

Um ein DateTimeObjekt in PHP zum Speichern in MySQL korrekt zu formatieren, verwenden Sie das von MySQL verwendete standardisierte Format ISO 8601 .

PHP hat dieses Format seit Version 5.1.1 als Konstante gespeichert, und ich empfehle dringend, es zu verwenden, anstatt die Zeichenfolge jedes Mal manuell einzugeben.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Diese und eine Liste anderer PHP DateTime-Konstanten finden Sie unter http://php.net/manual/en/class.datetime.php#datetime.constants.types

Greg
quelle
MySQL verwendet dieses Format nicht wirklich und MySQL generiert eine Warnung, wenn Sie den Zeitzonenbezeichner "+ xxxx" angeben, der von ihm generiert wird. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100' wobei Z; Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,06 Sek.) Übereinstimmende Zeilen: 1 Geändert: 0 Warnungen: 1
George Lund
OP möchte ein Datum aus dem MySQL-Format übernehmen und in MM / TT / JJ H: M (AM / PM) konvertieren .
Toxalot
8

Dies sollte ein Feld in einer SQL-Abfrage formatieren:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename
Riz
quelle
Sie sollten eine MySQL- Abfrage angeben , nicht nur SQL, da dies nicht unbedingt mit allen Datenbanken funktioniert. Während OP nach einer PHP-Lösung fragte, ist dies eine gute Alternative, von der OP möglicherweise nichts gewusst hat. Dies liefert jedoch nicht das angeforderte Format. Um das angeforderte Format OP zu erhalten, benötigen Sie '%m/%d/%y %h:%i %p'.
Toxalot
7

Verwenden Sie die Datumsfunktion :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Gustavo Carreno
quelle
25
Erwartet die Funktion date () nicht einen ganzzahligen Zeitstempel anstelle einer in der Frage angegebenen Datums- und Uhrzeitangabe?
Loftx
5

Abhängig von Ihrer MySQL-Datums- / Uhrzeitkonfiguration. Normalerweise: 2011-12-31 07:55:13 Format. Diese sehr einfache Funktion sollte die Magie bewirken:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Oder etwas weiter fortgeschritten, um der Frage zu entsprechen.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
tfont
quelle
1
Dies beantwortet keine OP-Frage. OP möchte ein Datum aus dem MySQL-Format übernehmen und in MM / TT / JJ H: M (AM / PM) konvertieren . Außerdem wird nur die aktuelle Uhrzeit formatiert, nicht ein bestimmtes Datum.
Toxalot
5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Wenn Sie nicht jede Funktion in Ihrem PHP-Code ändern möchten, um das erwartete Datumsformat anzuzeigen, ändern Sie es an der Quelle - Ihrer Datenbank.

Es ist wichtig , die Zeilen mit dem nennen als Operator , wie im Beispiel oben (als datefrom, wie dateUntil). Die Namen, die Sie dort schreiben, sind die Namen, die Zeilen werden in Ihrem Ergebnis aufgerufen.

Die Ausgabe dieses Beispiels wird sein

[Tag des Monats, numerisch (0..31)]. [Monatsname (Januar..Dezember)]. [Jahr, numerisch, vierstellig]

Beispiel: 5.August 2015

Ändern Sie die Punkte mit dem Trennzeichen Ihrer Wahl und überprüfen Sie die Funktion DATE_FORMAT (Datum, Format) auf weitere Datumsformate.

Rangel
quelle
3

Sie können Ihre Abfrage auch die Zeit als Unix-Zeitstempel zurückgeben lassen. Das würde die Notwendigkeit des Anrufens beseitigen strtotime()und die Dinge auf der PHP-Seite etwas weniger intensiv machen ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Verwenden Sie dann in PHP einfach die date()Funktion, um sie nach Ihren Wünschen zu formatieren.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

oder

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Ich mag diesen Ansatz im Gegensatz zur Verwendung der MySQL - DATE_FORMATFunktion, da Sie damit dieselbe Abfrage wiederverwenden können, um die Daten abzurufen, und die Formatierung in PHP ändern können.

Es ist ärgerlich, zwei verschiedene Abfragen zu haben, um das Aussehen des Datums in der Benutzeroberfläche zu ändern.

Phatduckk
quelle
Ich mag die Idee UNIX_TIMESTAMP, die Notwendigkeit zu beseitigen strtotime. Diese Antwort wäre besser, wenn sie ein Beispiel für die Formatierung der Zeit in dem tatsächlich angeforderten Format OP geben würde.
Toxalot
1

Sie können Probleme mit Daten haben, die nicht in Unix Timestamp zurückgegeben wurden. Dies funktioniert also für mich ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))
matt.j.crawford
quelle
1
Dadurch wird das Datum nicht in das von OP angeforderte Format konvertiert.
Toxalot
1

Das wird funktionieren...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Mihir Vadalia
quelle
1
Dieses Format wird 24 Mal mit AM / PM gemischt. Ansonsten entspricht es der akzeptierten Antwort, die vor mehr als 5 Jahren veröffentlicht wurde.
Toxalot
0

Mit PHP Version 4.4.9 und MySQL 5.0 funktionierte dies für mich:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateist die Spalte in MySQL .

Peter Mortensen
quelle
Dies konvertiert das Datum nicht in das von OP
Toxalot
0

Der von mir vorgeschlagene Ansatz funktioniert wie folgt. Zunächst erstellen Sie ein grundlegendes Datum / Uhrzeit-Objekt aus einer mit MySQL formatierten Zeichenfolge. und dann formatieren Sie es nach Ihren Wünschen. Glücklicherweise ist mysql datetime ISO8601-konform, sodass der Code selbst recht einfach und elegant aussehen kann. Beachten Sie jedoch, dass diese datetimeSpalte keine Zeitzoneninformationen enthält. Sie müssen sie daher entsprechend konvertieren .

Hier ist der Code:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Es gibt aus 01/19/2038 11:14AM- hoffentlich was Sie erwarten.

In diesem Beispiel wird die Baiser-Bibliothek verwendet. Sie können noch mehr davon ausprobieren, wenn Sie Lust haben.

Vadim Samokhin
quelle
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
quelle
1
Dies beantwortet keine OP-Frage. OP möchte ein Datum aus dem MySQL-Format übernehmen und in MM / TT / JJ H: M (AM / PM) konvertieren . Dies macht das Gegenteil. Außerdem werden Eingaben aus einem Formular und nicht aus der Datenbank vorgenommen.
Toxalot