576 Stimmen

NOW()-Funktion in PHP

Gibt es eine PHP-Funktion, die das Datum und die Uhrzeit im gleichen Format wie die MySQL-Funktion NOW() ?

Ich weiß, wie man es macht, indem man date() aber ich frage, ob es eine Funktion nur für diesen Zweck gibt.

Zum Beispiel, um zurückzukehren:

2009-12-01 00:00:00

1213voto

troelskn Punkte 110542

Sie können die Datum Funktion:

date("Y-m-d H:i:s");

177voto

hsz Punkte 142920
date('Y-m-d H:i:s')

Weitere Einzelheiten finden Sie hier: http://pl.php.net/manual/en/function.date.php

126voto

vascowhite Punkte 17646

Mit PHP-Version >= 5.4 DateTime kann dies tun:-

echo (new \DateTime())->format('Y-m-d H:i:s');

Sehen, wie es funktioniert .

45voto

Julian Punkte 3697

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

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'),
);

42voto

user1786647 Punkte 558

Verwenden Sie diese Funktion:

function getDatetimeNow() {
    $tz_object = new DateTimeZone('Brazil/East');
    //date_default_timezone_set('Brazil/East');

    $datetime = new DateTime();
    $datetime->setTimezone($tz_object);
    return $datetime->format('Y\-m\-d\ h:i:s');
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X