Ich denke, dass Ihre Datum-Uhrzeit-Werte im Feld vom Typ DATETIME
bleiben wäre eine Art natürlicher Weg.
Aus eigener Erfahrung mit meiner aktuellen PHP-Anwendung nur read
/ write
Vorgänge bezüglich dieser Informationen können problematisch sein.
Eine der möglichen Lösungen (vorausgesetzt, Sie verwenden DATETIME
Datentyp) für die ordnungsgemäße Durchführung des gesamten Prozesses könnte der folgende Ansatz sein:
Lesen von DATETIME-Werten für die PHP-Nutzung
- Erfassen Sie
DATETIME
Felder aus Ihrer Datenbank, indem Sie sie in der Abfrage konvertieren zur Zeichenfolgendarstellung in Form von'2011-10-02T23:25:42Z'
durch Verwendung vonDATE_FORMAT
MySQL-Funktion mit'%Y-%m-%dT%H:%i:%sZ'
Formatierungszeichenfolge (docs am DATE_FORMAT ) - Lesen Sie den abgerufenen Spaltenwert in diesem speziellen Format und konvertieren Sie ihn in PHP von einer Zeichenfolge in eine echte Datums-Zeit-Darstellung, die für PHP gültig ist (z. B.
DateTime
). Klassenobjekte undDateTime::createFromFormat
statische Methode gegeben'Y-m-d\TH:i:s\Z'
Formatierungsstring (T
undZ
werden maskiert, um sie nicht als Formatierungsanweisungen zu behandeln) (docs for the method ). - Verwenden Sie konvertierte Werte als echte Datum-Uhrzeit-Werte mit der gesamten anwendbaren Logik, wie echte Datumsvergleiche (keine Textvergleiche) usw.
Datum und Uhrzeit von PHP in die MySQL-Datenbank schreiben
- Konvertiere z.B. PHP
DateTime
-Klassenobjekt zu unserer ISO 8601 im UTC-Format Zeichenfolgendarstellung mitDateTime
format
des Klassenobjekts Methode mit der gleichen wie zuvor'Y-m-d\TH:i:s\Z'
Formatierungszeichenfolge (Dokumentation ). ). - Führen Sie
INSERT
aus /UPDATE
Operation mit Datenbankinformationen unter Verwendung einer solchen vorbereiteten Zeichenfolge als Parameter für die MySQL-FunktionSTR_TO_DATE
(mit'%Y-%m-%dT%H:%i:%sZ'
Formatierungsstring), der ihn in die echte DatenbankDATETIME
umwandelt Wert (Dokumente am STR_TO_DATE ).
Beispielcode in PHP
Nachfolgend finden Sie ein Entwurfsbeispiel für einen solchen Ansatz unter Verwendung von PDO-Objekten:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
Dieser Ansatz hat mir sehr beim Betrieb von Datums- und Uhrzeitwerten zwischen PHP und MySQL-Datenbank geholfen.
Ich hoffe, es könnte auch für Sie hilfreich sein.