PHP date () Format beim Einfügen in datetime in MySQL

324

Was ist das richtige Format, um die date()Funktion in PHP zu übergeben, wenn ich das Ergebnis in eine datetimeSpalte vom Typ MySQL einfügen möchte ?

Ich habe es versucht, date("Y-M-D G:i:s")aber das fügt jedes Mal nur "0000-00-00 00:00:00" ein.

Alex
quelle
3
Da Sie bisher keinen Parameter angeben, möchten Sie tatsächlich die aktuelle Uhrzeit aufzeichnen?
Mark Elliot

Antworten:

680

Das Problem ist, dass Sie verwenden 'M'und 'D'MySQL als Textdarstellung eine numerische Darstellung des Formats erwartet2010-02-06 19:30:13

Versuchen Sie: Dies date("Y-m-d H:i:s")verwendet die numerischen Äquivalente.

Bearbeiten: Umgeschaltet Gauf H, obwohl dies möglicherweise keine Auswirkungen hat, möchten Sie wahrscheinlich das 24-Stunden-Format mit führenden Nullen verwenden.

Mark Elliot
quelle
28
Dies muss eines der häufigsten Datetime-Formate sein, die jemals jemand benötigen würde. sollte eine eingebaute PHP Global oder ein Teil der
Datumsfunktion
33
Warum dies nicht der Fall ist, weiß ich nicht. Ich muss mich auf jeden Stapelüberlauf beziehen. Single. Funktion. Zeit.
Mazatec
11
Es ist schneller, hierher zu kommen, als in meinem Code nach einer solchen Verwendung zu suchen.
MRodrigues
64
Ich dachte nur an eine niedliche Mnemonik, um mich an das Format zu erinnern: " Y my m y d ate not His ". funktioniert auf so vielen Ebenen :)
IzzEps
2
Es sollte eine PHP-Abkürzung dafür geben, wie es für ISO 8601 und RFC 2822
Billynoah
105

Aus den Kommentaren der PHP- date()Handbuchseite :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

Sie hatten das 'Y' richtig - das ist ein volles Jahr, aber 'M' ist ein dreistelliger Monat, während 'm' ein zweistelliger Monat ist. Gleiches Problem mit 'D' anstelle von 'd'. 'G' ist eine 1- oder 2-stellige Stunde, wobei 'H' bei Bedarf immer eine führende 0 hat.

Tim Lytle
quelle
1
Danke @Pekka - ich erinnere mich, als du und ich ungefähr den gleichen Repräsentanten hatten - du warst ziemlich aktiv.
Tim Lytle
1
Ja, ich arbeite gerade viel und SO ist mein Lieblingsbeschäftigung dazwischen :) das wird sich wieder ändern.
Pekka
41

Hier ist eine alternative Lösung: Wenn Sie das Datum in PHP als Zeitstempel haben, umgehen Sie die Behandlung mit PHP und lassen Sie die DB mithilfe der FROM_UNIXTIMEFunktion die Transformation übernehmen .

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+
JAL
quelle
Dies ist eine elegante Lösung.
Danke
2
@trejder, Wer hat dir gesagt, dass es schneller in MySQL ist als in PHP? Dies in PHP zu tun ist besser, da die Datenbank normalerweise der Engpass ist und Sie so schnell wie möglich ein- und aussteigen möchten .
Pacerier
1
@Pacerier Die Datenbank ist der Engpass, wenn Sie eine schlecht erstellte Datenbank haben oder zu viele kleine Abfragen anstelle einer robusteren effektiven Einzelabfrage ausführen oder in vielen Fällen, wenn Sie sich bei der Verwaltung der Datenbank auf einen ORM verlassen. Solides SQL mit einer gut indizierten relationalen Datenbank ist nicht langsam.
Mopsyd
2
@mopsyd, Die Datenbank ist der Engpass, da die horizontale Skalierung Komplexität erfordert. Vergleichen Sie dies mit Webservern, die weltweit ohne Codeänderungen dupliziert werden können.
Pacerier
1
Wenn die Abfrage fehlschlägt, irgendwo protokolliert wird und Sie sie debuggen müssen, ist der Zeitstempel viel schwerer zu lesen als die von @ tim-lytle beschriebene formatierte Datumszeichenfolge.
Humbads
27

Ich verwende den folgenden PHP-Code, um eine Variable zu erstellen, die ich in eine MySQL DATETIME-Spalte einfüge.

$datetime = date_create()->format('Y-m-d H:i:s');

Hier werden das aktuelle Datum und die aktuelle Uhrzeit des Servers gespeichert.

Steffan Clent Davies
quelle
12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`
Ali Umair
quelle
2
Obwohl dieser Code die Frage beantworten kann, würde die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie er die Frage beantwortet, ihren langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen und Ihre Formatierungsprobleme zu beheben.
Toby Speight
9

Formatieren Sie den Zeitstempel in die MySQL DATETIME-Spalte:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Ahmed Sabre
quelle
8

Formatieren Sie MySQL datetime mit PHP

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
dev4092
quelle
8

Ich benutze diese Funktion (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

Ältere Versionen von PHP (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}
SandroMarques
quelle
Ich habe Ihre Antwort abgelehnt, weil sie funktioniert hat, nachdem ich die erste Zeile bearbeitet habe. function getDateForDatabase(string $date) : string {zu function getDateForDatabase($date) {Warum weiß die Typdeklarationen einen Fehler aus , ich PHP nicht genug zu erzählen.
Chris Pink
"Argument 1, das an getDateForDatabase () übergeben wurde, muss eine Instanz von Zeichenfolge sein, Zeichenfolge angegeben" - meine Eingabe war eine Zeichenfolge
Chris Pink
7

Es ist nicht erforderlich, die date () -Methode von PHP nicht zu verwenden, wenn Sie keinen Zeitstempel verwenden. Wenn datepostedes sich um eine Datums- / Uhrzeitspalte handelt, können Sie das aktuelle Datum folgendermaßen einfügen:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adam
quelle
2
Vielen Dank, dass Sie diesen Ansatz teilen. Es ist die einfachste Methode, die ich bisher gesehen habe.
Shondeslitch
2

Das hat mich verrückt gemacht, nach einer einfachen Antwort zu suchen. Schließlich habe ich diese Funktion erstellt, die alle Eingaben zu erfassen scheint und eine gute SQL-Zeichenfolge angibt, die korrekt oder zumindest gültig und überprüfbar ist. Wenn es der 31.12.1999 ist, ist es wahrscheinlich falsch, wirft aber keinen schlimmen Fehler in MySQL.

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}
Brian Jones
quelle
1

Verwenden der DateTimeKlasse in PHP7 +:

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}
Nino Škopac
quelle
1

Ein kleiner Nachtrag zur akzeptierten Antwort: Wenn die Datenbank datetimeals UTC gespeichert ist (was ich immer mache), sollten Sie gmdate("Y-m-d H:i:s")stattdessen verwenden date("Y-m-d H:i:s").

Wenn Sie es vorziehen, MySQL alles erledigen zu lassen, wie einige Antworten vermuten lassen, würde ich MySQLs UTC_TIMESTAMPmit dem gleichen Ergebnis einfügen .

Hinweis: Ich habe die Frage zur aktuellen Zeit verstanden.

Bruno
quelle
0

Dies ist ein genauerer Weg, dies zu tun. Es setzt Dezimalstellen hinter die Sekunden und sorgt so für mehr Präzision.

$now = date('Y-m-d\TH:i:s.uP', time());

Beachten Sie die .uP.

Weitere Informationen: https://stackoverflow.com/a/6153162/8662476

Maurici Abad
quelle