web-dev-qa-db-fra.com

PHP format de date () lors de l'insertion de date / heure dans MySQL

Quel est le format correct à transmettre à la fonction date() dans PHP si je souhaite insérer le résultat dans une colonne de type MySQL datetime?

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

288
Alex

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

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

edit: a changé G en H, bien que cela n’ait pas d’impact, vous souhaitez probablement utiliser le format 24 heures avec les 0 premiers.

627
Mark Elliot

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

<?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, alors que "m" est un mois à deux chiffres. Même problème avec 'D' au lieu de 'd'. "G" correspond à une heure à 1 ou 2 chiffres, où "H" est toujours précédé d'un 0 lorsque nécessaire.

101
Tim Lytle

Voici une solution alternative: si vous avez la date dans PHP en tant qu'horodatage, ignorez-la en la manipulant avec PHP et laissez la base de données la transformer en utilisant le FROM_UNIXTIME. une fonction.

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

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.

24
$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`
10
Ali Umair

Formatez l'horodatage dans la colonne MySQL DATETIME:

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

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;
}
8
SandroMarques

Formater la date et l'heure MySQL avec PHP

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

Il n'est pas nécessaire de ne pas utiliser la méthode date () de PHP si vous n'utilisez pas d'horodatage. Si dateposted est une colonne datetime, vous pouvez insérer la date actuelle de la manière suivante:

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

Cela m'a rendu fou à la recherche d'une réponse simple. Finalement, j'ai créé cette fonction qui semble capturer toutes les entrées et donner une bonne chaîne SQL correcte ou au moins valide et vérifiable. Si c'est le 1999-12-31, c'est probablement une erreur, mais cela ne génère 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));
    }
}
1
Brian Jones

Utiliser DateTime class 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");
}
1
Nino Škopac

Un petit ajout à la réponse acceptée: Si la base de données datetime est stockée au format UTC (ce que je fais toujours), vous devez utiliser gmdate("Y-m-d H:i:s") au lieu de date("Y-m-d H:i:s").

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

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

0
Bruno

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());

Notez le .uP.

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

0