Formato data () di PHP quando si inserisce in datetime in MySQL


324

Qual è il formato corretto da passare alla date()funzione in PHP se voglio inserire il risultato in una datetimecolonna di tipo MySQL ?

Ci ho provato, date("Y-M-D G:i:s")ma ogni volta inserisco semplicemente "registrazione 00:00:00".


3
dal momento che non stai fornendo un parametro fino ad oggi, vuoi davvero registrare l'ora corrente?
Mark Elliot,

Risposte:


680

Il problema è che stai usando 'M'e 'D', che sono rappresentazioni testuali, MySQL si aspetta una rappresentazione numerica del formato2010-02-06 19:30:13

Prova: date("Y-m-d H:i:s")che utilizza gli equivalenti numerici.

modifica: passato Ga H, anche se potrebbe non avere impatto, probabilmente si desidera utilizzare il formato 24 ore con 0 iniziali.


28
questo deve essere uno dei singoli formati di data / ora più comuni di cui chiunque abbia mai bisogno. dovrebbe essere integrato in php global o parte della funzione date stessa (es. 'c', 'r')
billynoah

33
Perché non è così non lo so. Devo fare riferimento a overflow dello stack ogni. singolo. funzionamento. tempo.
Mazatec,

11
È più veloce venire qui, piuttosto che cercare nel mio codice un utilizzo come questo.
MRodrigues,

64
Proprio pensato a un mnemonico simpatico per ricordare il formato: " Y nostra m y d non ha mangiato il suo ". funziona su così tanti livelli :)
IzzEps,

2
Dovrebbe esserci una scorciatoia php per questo, come per ISO 8601 e RFC 2822
billynoah

105

Dai commenti della date()pagina del manuale di php :

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

Hai avuto la "Y" corretta - è un anno intero, ma "M" è un mese di tre caratteri, mentre "m" è un mese di due cifre. Stesso problema con 'D' invece di 'd'. 'G' è un'ora a 1 o 2 cifre, dove 'H' ha sempre uno 0 iniziale quando necessario.


1
Grazie @Pekka - Ricordo quando io e te avevamo più o meno lo stesso rappresentante - sei stato piuttosto attivo.
Tim Lytle,

1
sì, sto lavorando molto in questo momento, e così è il mio passatempo preferito in mezzo :) che cambierà di nuovo.
Pekka,

41

Ecco una soluzione alternativa: se hai la data in PHP come data e ora, evita di gestirla con PHP e lascia che il DB si occupi di trasformarla utilizzando la FROM_UNIXTIMEfunzione.

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 |
+---------------------+

Questa è una soluzione elegante.Grazie :)
kta,

2
@trejder, chi ti ha detto che farlo in mysql è più veloce che farlo in php? Farlo in PHP è meglio perché il DB di solito è il collo di bottiglia e vuoi entrare e uscire al più presto .
Pacerier,

1
@Pacerier the DB è il collo di bottiglia se si dispone di un DB mal costruito, o si eseguono troppe piccole query invece di una singola query efficace più robusta, o in molti casi se si fa affidamento su un ORM per gestire il database. L'SQL solido con un database relazionale ben indicizzato non è lento.
mopsyd,

2
@mopsyd, Il DB è il collo di bottiglia perché il ridimensionamento orizzontale richiede complessità. Confrontalo con i server web che possono essere duplicati in tutto il mondo senza alcuna modifica del codice.
Pacerier,

1
Se la query ha esito negativo, viene registrata da qualche parte e devi eseguirne il debug, la data e l'ora sono molto più difficili da leggere rispetto alla stringa di data formattata descritta da @ tim-lytle.
humbads

27

Uso il seguente codice PHP per creare una variabile che inserisco in una colonna DATETIME di MySQL.

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

Ciò conterrà la data e l'ora correnti del server.


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`

2
Sebbene questo codice possa rispondere alla domanda, fornendo un contesto aggiuntivo per quanto riguarda il perché e / o il modo in cui risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine. Si prega di modificare la risposta di aggiungere qualche spiegazione, e per risolvere i problemi di formattazione.
Toby Speight,

9

Formatta il timestamp nella colonna DATETIME di MySQL:

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

8

Formatta MySQL datetime con PHP

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

8

Uso questa funzione (PHP 7)

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

Versioni precedenti di PHP (PHP <7)

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

Ho votato la tua risposta perché ha funzionato dopo aver modificato la prima riga; function getDateForDatabase(string $date) : string {a function getDateForDatabase($date) {Perché le dichiarazioni di tipo generano un errore non conosco abbastanza PHP da dirlo.
Chris Pink,

"L'argomento 1 passato a getDateForDatabase () deve essere un'istanza di stringa, stringa fornita," - il mio input era una stringa,
Chris Pink,

7

Non è necessario utilizzare il metodo date () di PHP se non si utilizza un timestamp. Se datepostedè una colonna datetime, puoi inserire la data corrente in questo modo:

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
Grazie per condividere questo approccio. È il metodo più semplice che abbia mai visto.
Shondeslitch,

2

Questo mi sta facendo impazzire in cerca di una risposta semplice. Alla fine ho realizzato questa funzione che sembra catturare tutti gli input e dare una buona stringa SQL che sia corretta o almeno valida e controllabile. Se è il 1999-12-31 è probabilmente sbagliato ma non genererà un errore errato 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));
    }
}

1

Utilizzando la DateTimeclasse 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");
}

1

Un piccolo addendum alla risposta accettata: se il database datetimeè archiviato come UTC (cosa faccio sempre), è necessario utilizzare gmdate("Y-m-d H:i:s")invece di date("Y-m-d H:i:s").

Oppure, se preferisci lasciare che MySQL gestisca tutto, come suggeriscono alcune risposte, inserirò MySQL UTC_TIMESTAMP, con lo stesso risultato.

Nota: ho capito la domanda relativa all'ora corrente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.