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
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.)
@ 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)):
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
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)
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.
-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".
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.
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
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'.
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:
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.
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.
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)))
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(newFromISO8601('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.
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.
OOP
Datetime-Funktionen zu verwenden, sie sind sehr einfach zu bedienen.mm/dd/yy
ist 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 ist11-12-13
. Der universellere Standard istyyyy-mm-dd
und ist Teil des ISO 8601-Standards. Gelingt das nicht , sollten Sie den Monat verwenden Namen , nicht die Anzahl.Antworten:
Wenn Sie nach einer Möglichkeit suchen, ein Datum im MySQL-Format zu normalisieren, verwenden Sie Folgendes
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-date
Funktion, 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.)
quelle
does not work
fü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.So konvertieren Sie ein von MySQL abgerufenes Datum in das angeforderte Format (
mm/dd/yy H:M (AM/PM)
):Informationen zum Anpassen des Formats finden Sie in den PHP-Datumsformatierungsoptionen .
quelle
$row
Objekt kommen?Wenn Sie PHP 5 verwenden, können Sie es auch versuchen
quelle
("Y-m-d H:i:s")
Referenz: http://php.net/manual/en/function.date.php
quelle
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)
quelle
\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
datetime
Spalten sollten UTF8 sein. Übergeben Sie sie dahernew DateTimeZone('UTC')
als dritten Parameter, um sicherzustellen, dass PHP dies weiß.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.
quelle
date
Funktion geschrieben haben, sollten Sie auch überstrottime
Funktion schreiben, um jemandem zu helfen, anstatt "aber Sie müssen zuerst Ihren Datenbankwert in einen Zeitstempel konvertieren".Vergiss alles. Benutz einfach:
quelle
Um ein
DateTime
Objekt 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.
Diese und eine Liste anderer PHP DateTime-Konstanten finden Sie unter http://php.net/manual/en/class.datetime.php#datetime.constants.types
quelle
Dies sollte ein Feld in einer SQL-Abfrage formatieren:
quelle
'%m/%d/%y %h:%i %p'
.Verwenden Sie die Datumsfunktion :
quelle
Abhängig von Ihrer MySQL-Datums- / Uhrzeitkonfiguration. Normalerweise: 2011-12-31 07:55:13 Format. Diese sehr einfache Funktion sollte die Magie bewirken:
Oder etwas weiter fortgeschritten, um der Frage zu entsprechen.
quelle
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.
quelle
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 ...Verwenden Sie dann in PHP einfach die
date()
Funktion, um sie nach Ihren Wünschen zu formatieren.oder
Ich mag diesen Ansatz im Gegensatz zur Verwendung der MySQL -
DATE_FORMAT
Funktion, 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.
quelle
UNIX_TIMESTAMP
, die Notwendigkeit zu beseitigenstrtotime
. 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.Sie können Probleme mit Daten haben, die nicht in Unix Timestamp zurückgegeben wurden. Dies funktioniert also für mich ...
quelle
Das wird funktionieren...
quelle
Mit PHP Version 4.4.9 und MySQL 5.0 funktionierte dies für mich:
PubDate
ist die Spalte in MySQL .quelle
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
datetime
Spalte keine Zeitzoneninformationen enthält. Sie müssen sie daher entsprechend konvertieren .Hier ist der Code:
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.
quelle
quelle