Format PHP date () lors de l'insertion dans datetime dans MySQL

324

Quel est le format correct à passer à la date()fonction en PHP si je veux insérer le résultat dans une datetimecolonne de type MySQL ?

J'ai essayé date("Y-M-D G:i:s")mais cela insère juste "0000-00-00 00:00:00" à chaque fois.

Alex
la source
3
étant donné que vous ne fournissez pas de paramètre à ce jour, voulez-vous réellement enregistrer l'heure actuelle?
Mark Elliot

Réponses:

680

Le problème est que vous utilisez 'M'et 'D', qui sont des représentations textuelles, MySQL attend une représentation numérique du format2010-02-06 19:30:13

Essayez: date("Y-m-d H:i:s")qui utilise les équivalents numériques.

edit: basculé Gsur H, bien que cela n'ait pas d'impact, vous souhaiterez probablement utiliser le format 24 heures avec les 0 en tête.

Mark Elliot
la source
28
il doit s'agir de l'un des formats de datetime les plus courants dont tout le monde aurait besoin. devrait être une fonction php globale intégrée ou faire partie de la fonction de date elle-même (par exemple, 'c', 'r')
billynoah
33
Pourquoi ce n'est pas le cas, je ne sais pas. Je dois faire référence au débordement de pile à chaque fois. Célibataire. fonctionnement. temps.
Mazatec
11
Il est plus rapide de venir ici que de rechercher dans mon code une utilisation comme celle-ci.
MRodrigues
64
Je pensais juste que d'un mnémotechnique pour se souvenir mignon format: « Y notre m y d a mangé pas son ». fonctionne à tellement de niveaux :)
IzzEps
2
Il devrait y avoir un raccourci php pour cela comme pour ISO 8601 et RFC 2822
billynoah
105

D'après les commentaires de la date()page de manuel de php :

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

Vous aviez le «Y» correct - c'est une année complète, mais «M» est un mois à trois caractères, tandis que «m» est un mois à deux chiffres. Même problème avec «D» au lieu de «d». 'G' est une heure à 1 ou 2 chiffres, où 'H' a toujours un 0 en tête si nécessaire.

Tim Lytle
la source
1
Merci @Pekka - Je me souviens quand vous et moi avions à peu près le même représentant - vous avez été assez actif.
Tim Lytle
1
oui, je travaille beaucoup en ce moment, et donc c'est mon passe-temps préféré entre les deux :) qui changera à nouveau.
Pekka
41

Voici une solution alternative: si vous avez la date en PHP comme horodatage, contournez-la en la manipulant avec PHP et laissez la base de données se charger de la transformer en utilisant la FROM_UNIXTIMEfonction.

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
la source
Ceci est une solution élégante.Merci :)
kta
2
@trejder, Qui vous a dit que le faire dans mysql est plus rapide que le faire dans php? Il est préférable de le faire en PHP car la base de données est généralement le goulot d'étranglement et vous souhaitez entrer et sortir dès que possible .
Pacerier
1
@Pacerier the DB est le goulot d'étranglement si vous avez une base de données mal construite, ou si vous exécutez trop de petites requêtes au lieu d'une requête unique efficace plus robuste, ou dans de nombreux cas si vous comptez sur un ORM pour gérer la base de données. Solid SQL avec une base de données relationnelle bien indexée n'est pas lent.
mopsyd
2
@mopsyd, La base de données est le goulot d'étranglement car sa mise à l'échelle horizontale nécessite de la complexité. Comparez cela aux serveurs Web qui peuvent être dupliqués à travers le monde sans aucune modification de code.
Pacerier
1
Si la requête échoue, est enregistrée quelque part et que vous devez la déboguer, l'horodatage est beaucoup plus difficile à lire que la chaîne de date formatée décrite par @ tim-lytle.
humbads
27

J'utilise le code PHP suivant pour créer une variable que j'insère dans une colonne MySQL DATETIME.

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

Cela contiendra la date et l'heure actuelles du serveur.

Steffan Clent Davies
la source
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
la source
2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment il répond à la question améliorerait considérablement sa valeur à long terme. Veuillez modifier votre réponse pour ajouter des explications et résoudre vos problèmes de formatage.
Toby Speight
9

Formater l'horodatage dans la colonne MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Ahmed Saber
la source
8

Formater le datetime MySQL avec PHP

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

J'utilise cette fonction (PHP 7)

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

Anciennes versions de PHP (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}
SandroMarques
la source
J'ai voté pour votre réponse car elle a fonctionné après avoir modifié la première ligne; function getDateForDatabase(string $date) : string {à function getDateForDatabase($date) {Pourquoi les déclarations de type jettent une erreur que je ne connais pas assez PHP pour le dire.
Chris Pink
"L'argument 1 passé à getDateForDatabase () doit être une instance de chaîne, chaîne donnée," - mon entrée était une chaîne,
Chris Pink
7

Il n'est pas nécessaire d'utiliser la méthode date () de PHP si vous n'utilisez pas d'horodatage. S'il dateposteds'agit d'une colonne datetime, vous pouvez insérer la date actuelle comme ceci:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adam
la source
2
Merci de partager cette approche. C'est la méthode la plus simple que j'ai vue jusqu'à présent.
Shondeslitch
2

Cela m'a rendu fou à la recherche d'une réponse simple. Enfin, j'ai fait cette fonction qui semble intercepter toutes les entrées et donner une bonne chaîne SQL correcte ou au moins valide et vérifiable. Si c'est 1999-12-31, c'est probablement faux, mais ne générera pas une mauvaise erreur dans 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
la source
1

Utiliser la DateTimeclasse en 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
la source
1

Un petit addendum à la réponse acceptée: si la base de données datetimeest stockée en UTC (ce que je fais toujours), vous devez utiliser à la gmdate("Y-m-d H:i:s")place de date("Y-m-d H:i:s").

Ou, si vous préférez laisser MySQL gérer tout, comme certaines réponses le suggèrent, j'insérerais MySQL UTC_TIMESTAMP, avec le même résultat.

Remarque: j'ai compris la question concernant l'heure actuelle.

Bruno
la source
0

C'est une façon plus précise de le faire. Il place les décimales derrière les secondes pour plus de précision.

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

Remarquez le .uP.

Plus d'informations: https://stackoverflow.com/a/6153162/8662476

Maurici Abad
la source