Kurze Antwort
$now = date_create()->format('Y-m-d H:i:s');
Die lange Antwort finden Sie weiter unten.
Die Nachahmung der MySQL-Funktion NOW() in PHP
Hier ist eine Liste von Möglichkeiten in PHP, die MySQL imitieren NOW()
Funktion.
// relative date
$now = date_create('now')->format('Y-m-d H:i:s'); // works in php 5.2 and higher
$now = date_create()->format('Y-m-d H:i:s'); // also works in php 5.2
$now = new DateTime('now')->format('Y-m-d H:i:s'); // syntax error!!!
$now = (new DateTime('now'))->format('Y-m-d H:i:s'); // works in php 5.4 and higher
$now = date('Y-m-d H:i:s'); // Slightly higher performance, but less usable for date/time manipulations
// From Unix timestamp
// Using date_create() with a Unix timestamp will give you a FALSE,
// and if you try to invoke format() on a FALSE then you'll get a:
// Fatal error: Call to a member function format() on boolean
// So if you work with Unix timestamps then you could use: date_create_from_format().
$unixTimeStamp = 1420070400; // 01/01/2015 00:00:00
$y2015 = date_create_from_format('U', $unixTimeStamp, timezone_open('Europe/Amsterdam'))->format('Y-m-d H:i:s');
$y2015 = date('Y-m-d H:i:s', $unixTimeStamp);
Ich denke, dass date_create()->format('Y-m-d H:i:s')
ist der beste Weg, weil dieser Ansatz es erlaubt, Zeit/Zeitzonenmanipulationen einfacher zu handhaben als date('Y-m-d H:i:s')
und es funktioniert seit php 5.2.
MySQL NOW()-Funktion
Die MySQL-Funktion NOW()
gibt den dateTime-Wert in diesem Format an: 'YYYY-MM-DD HH:MM:SS'
. Siehe hier: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .
Interessant ist, dass es möglich ist, das Datumsformat durch Ausführen dieser Abfrage zu erhalten: SHOW VARIABLES LIKE 'd%e_format'
könnte das Ergebnis in etwa so aussehen:
Variable_name Value
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
Die Variablen hier oben sind schreibgeschützte Variablen. Sie können sie also nicht ändern.
Ich vermute, dass die MySQL NOW()
Funktion erhält ihr Format von der datetime_format
variabel.
Die Vorteile von date_create()->format() statt date() Zusammenfassung
Die günstigen Fakten der date_create('now')->format('Y-m-d H:i:s')
en date('Y-m-d H:i:s')
sind:
- leichtere Handhabung von Zeitmanipulationen
- leichtere Handhabung von Zeitzonen
- o.o.p.
Die Nachteile von date_create()->format() statt date()
Die Funktion date()
hat eine etwas bessere Leistung als date_create()->format()
. Siehe Benchmark-Test unten.
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$a = date_create('now')->format('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeA = $end - $start;
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$b = date('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeB = $end - $start;
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 31
Case B, elapsed time in seconds: 14
Die Großschreibung zeigt, dass date()
ist schneller. Wenn wir jedoch das Testszenario ein wenig ändern, wird das Ergebnis anders ausfallen. Siehe unten:
$start = time();
$dt = date_create('now');
for ($i = 0; $i <= 5000000; $i++) {
$a = $dt->format('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeA = $end - $start;
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$b = date('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeB = $end - $start;
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 14
Case B, elapsed time in seconds: 15
Die DateTime-Methode: format()
ist hier schneller als date()
.
Die Vorteile von date_create()->format() statt date() im Einzelnen
Lesen Sie weiter, um eine detaillierte Erklärung zu erhalten.
leichtere Handhabung von Zeitmanipulationen
date_create()
akzeptiert ein relatives Datums-/Zeitformat (wie now
, yesterday
o +1 day
) siehe dieser Link , Beispiel:
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
date()
akzeptiert auch ein relatives Datums-/Zeitformat, etwa so:
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tomorrow = date('Y-m-d H:i:s', (time() + 86400)); // 86400 seconds = 1 day
leichtere Handhabung von Zeitzonen
Wenn Zeitzonen eine Rolle spielen, ist die Verwendung von date_create()->format()
macht viel mehr Sinn als date()
denn date()
verwendet die Standardzeitzone, die in php.ini
am date.timezone
Richtlinie. Link: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .
Es ist möglich, die Zeitzone während der Laufzeit zu ändern. Beispiel:
date_default_timezone_set('Asia/Tokyo');
.
Der Nachteil dabei ist, dass sich dies auf alle Datums-/Zeitfunktionen auswirken wird. Dieses Problem tritt nicht auf, wenn Sie date_create()->format()
in Verbindung mit timezone_open()
.
PHP unterstützt die wichtigsten Zeitzonen. Witzigerweise unterstützt es sogar den Polarkreis und die Antarktis. Haben Sie schon einmal etwas über Longyearbyen
? Wenn nicht, dann machen Sie sich keine Sorgen, das habe ich auch nicht, bis ich die offizielle PHP-Dokumentation gelesen habe.
$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');
Hier finden Sie eine Liste aller unterstützten Zeitzonen: http://php.net/manual/en/timezones.php .
o.o.p.
O.O.P. verwendet zustandslose Objekte. Ich ziehe es also vor, auf diese Weise zu denken:
// Create a DateTime Object.
// Use the DateTime that applies for tomorrow.
// Give me the datetime in format 'Y-m-d H:i:s'
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
Dann denken Sie auf diese Weise:
// Give me a date time string in format 'Y-m-d H:i:s',
// use strtotime() to calculate the Unix timestamp that applies for tomorrow.
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
Daher würde ich sagen, dass die date_create()->format()
Der Ansatz ist für mich besser lesbar als date()
.
date_create() VS new DateTime()
Die günstigen Fakten der date_create()
en new DateTime()
sind:
Namespaces
Wenn Sie in einem Namespace arbeiten und ein DateTime-Objekt mit dem new-Schlüsselwort initialisieren wollen, dann müssen Sie das so machen:
namespace my_namespace;
// The backslash must be used if you are in a namespace.
// Forgetting about the backslash results in a fatal error.
$dt = new \DateTime();
Daran ist nichts auszusetzen, aber der Nachteil ist, dass die Leute gelegentlich den Backslash vergessen. Durch die Verwendung des date_create()
Konstruktorfunktion müssen Sie sich nicht um Namespaces kümmern.
$dt = date_create(); // in or not in a namespace it works in both situations
Beispiel für date_create()->format()
Ich verwende diesen Ansatz für meine Projekte, wenn ich ein Array füllen muss. Zum Beispiel so:
$array = array(
'name' => 'John',
'date_time' => date_create('now')->format('Y-m-d H:i:s'), // uses the default timezone
'date_time_japan' => date_create('now', timezone_open('Asia/Tokyo'))->format('Y-m-d H:i:s'),
);