Convertir de MySQL datetime vers un autre format avec PHP

447

J'ai une datetimecolonne dans MySQL.

Comment puis-je le convertir en affichage en mm / jj / aa H: M (AM / PM) en utilisant PHP?

Tim Boland
la source
4
Ce que nous devons savoir, c'est comment la date est stockée dans le SQL. Est-ce Timestamp ou Datetime ou unixtime?
Ólafur Waage
Ils ne sont pas stockés en temps Unix, tout comme une date normale, PHP est celui qui les traite comme des secondes et d'autres choses. Je vous recommande d'utiliser les OOPfonctions PHP datetime, elles sont très faciles à utiliser.
Gucho Ca
2
Puis-je recommander et remplacer votre format de date? mm/dd/yyest très américain, et ceux d'entre nous qui vivent dans d'autres parties du monde deviennent plus qu'un peu irritables en essayant de deviner ce que l'on entend par 11-12-13. La norme la plus universelle est yyyy-mm-ddet fait partie de la norme ISO 8601. A défaut, vous devez utiliser le nom du mois , pas le numéro.
Manngo

Réponses:

515

Si vous cherchez un moyen de normaliser une date au format MySQL, utilisez ce qui suit

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

La ligne $phpdate = strtotime( $mysqldate )accepte une chaîne et effectue une série d'heuristiques pour transformer cette chaîne en horodatage Unix.

La ligne $mysqldate = date( 'Y-m-d H:i:s', $phpdate )utilise cet horodatage et la datefonction de PHP pour remettre cet horodatage au format de date standard de MySQL.

( Note de l'éditeur : cette réponse est ici en raison d'une question originale avec un libellé confus et de l'utilité générale de Google que cette réponse a fournie même si elle n'a pas répondu directement à la question qui existe maintenant)

kta
la source
19
cette réponse prête à confusion
Alex K
5
@ 0xBAADF00D: veuillez relire la question ... personne n'a posé de questions sur le format standard MySQL.
user7116
3
bien sûr, mais, lorsque le standard existe, il peut être agréable de suivre le standard (cela évite les maux de tête plus tard lorsqu'un autre développeur travaille sur votre code) xD
0xBAADF00D
4
La question demande de sortir au format mm / jj / aa H: M (AM / PM), pas "Ymd H: i: s".
Rikki
6
does not workpour qui? La réponse acceptée fonctionnera si vous souhaitez convertir de MySQL en mm / jj / aa H: M (AM / PM) comme OP l'a demandé. Ce n'est pas parce que vous voulez faire le contraire que la réponse acceptée est fausse.
toxalot
311

Pour convertir une date récupérée de MySQL au format demandé ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Reportez-vous aux options de formatage de date PHP pour ajuster le format.

Tim Boland
la source
D'où cet $rowobjet est-il censé provenir?
Mike
25
Je peux me tromper, mais je pense que certains d'entre vous manquent de raison. Il souhaite que la sortie soit au format "m / d / yg: i A", en tirant la date d'origine d'un champ DATETIME. Donc, son code fonctionne. @Mike $ row-> createdate n'est que la colonne datetime de Tim.
Mere Development
4
La réponse @AsTeR ne prête à confusion que si vous avez mal lu la question. OP a répondu à sa propre question et veut prendre une date de MySQL et la sortie au format demandé: mm / jj / aa H: M (AM / PM) .
toxalot
@TimBoland Je pense que la réponse pourrait être améliorée si de a été soulignée, ainsi que le format demandé mm / jj / aa H: M (AM / PM) . Et il pourrait bénéficier d'un lien vers la fonction date. J'ai essayé de suggérer une modification , mais elle a été rejetée.
toxalot
1
Fait amusant: cette réponse est à peu près équivalente à celle juste en dessous (qui n'a pratiquement pas de downvotes), mais elle a obtenu> 40 downvotes car elle répond à la question du PO, qui diffère de celle que les personnes qui viennent sur cette page ont réellement.
Clément
110

Si vous utilisez PHP 5, vous pouvez également essayer

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
la source
Comme indiqué ci-dessus dans les commentaires, le format standard est("Y-m-d H:i:s")
Yannickv
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Référence: http://php.net/manual/en/function.date.php

Tony Stark
la source
Je pense que les gens downvote parce qu'ils sont confus au sujet de la question OP. La plupart lisent la question comme étant l'opposé de ce qu'elle est réellement. L'autre possibilité est que cela est très similaire à la réponse acceptée qui a été publiée il y a 5+ ans.
toxalot
1
Le lien que vous référencez ne pointe pas vers la fonction que vous utilisez, ni n'explique le format. Je pense que php.net/function.date.php serait mieux.
toxalot
@toxalot La réponse acceptée est incorrecte. Il a été modifié après ma réponse et à propos de mon lien, je remplace votre lien. Merci
Tony Stark
1
Ce Q&A entier a une histoire sordide. La réponse acceptée était incorrecte entre le 29 avril 2013 et le 24 mai 2013. Elle était correcte lorsque vous avez publié votre réponse pour la première fois. Votre réponse était fausse jusqu'au 29 mai 2013, après quoi elle est devenue très similaire à la réponse acceptée.
toxalot
23

Enfin la bonne solution pour PHP 5.3 et supérieur: (ajout du fuseau horaire optionnel à l'exemple comme mentionné dans les commentaires)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
la source
son erreur .. Classe 'App \ Controller \ DateTime' introuvable .. en utilisant php 6.4
aswzen
1
Si vous travaillez dans un autre espace de noms, vous devez l'appeler avec une barre oblique inverse devant lui:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester
2
N'oubliez pas de spécifier le fuseau horaire lorsque vous créez votre objet date! Sinon, votre date formatée pourrait être de plusieurs heures de congé. Vos datetimecolonnes doivent être UTF8, passez donc new DateTimeZone('UTC')le 3ème paramètre pour vous assurer que PHP le sait.
Eric Seastrand
Ceci est la bonne réponse qui génère le format souhaité de l'OP, il suffit de prendre soin des fuseaux horaires
Accountant م
12

Un moyen plus simple serait de formater la date directement dans la requête MySQL, au lieu de PHP. Voir l' entrée manuelle MySQL pour DATE_FORMAT .

Si vous préférez le faire en PHP, vous avez besoin de la fonction date , mais vous devrez d'abord convertir la valeur de votre base de données en horodatage.

éclat
la source
11
-1 car le formatage de la date dans DB n'est pas une bonne idée. Le Web multilingue a besoin de différents formats de date et vous devez ensuite formater la date en PHP (langage de logique métier en commun). Lorsque vous avez écrit sur la datefonction, vous devez également écrire sur la strottimefonction pour aider quelqu'un au lieu de "mais vous devrez d'abord convertir la valeur de votre base de données en horodatage".
Boris Šuška
10

Oublie tout. Utilisez simplement:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
nixis
la source
9

Pour formater correctement un DateTimeobjet en PHP pour le stocker dans MySQL, utilisez le format standardisé utilisé par MySQL, qui est ISO 8601 .

PHP a ce format stocké en tant que constante depuis la version 5.1.1, et je recommande fortement de l'utiliser plutôt que de taper manuellement la chaîne à chaque fois.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Ceci et une liste d'autres constantes PHP DateTime sont disponibles sur http://php.net/manual/en/class.datetime.php#datetime.constants.types

Greg
la source
MySQL n'utilise pas réellement ce format, et MySQL génère un avertissement si vous incluez l'indicateur de fuseau horaire "+ xxxx" qui est généré par lui. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100' où Z; Requête OK, 0 lignes affectées, 1 avertissement (0,06 sec) Lignes correspondantes: 1 Modifié: 0 Avertissements: 1
George Lund
OP veut prendre une date au format MySQL et la convertir en mm / jj / aa H: M (AM / PM) .
toxalot
8

Cela devrait mettre en forme un champ dans une requête SQL:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename
riz
la source
Vous devez spécifier la requête MySQL , pas seulement SQL, car cela ne fonctionnera pas nécessairement avec toutes les bases de données. Bien qu'OP ait demandé une solution PHP, c'est une bonne alternative que OP ne connaissait peut-être pas. Cependant, cela ne fournira pas le format demandé. Pour obtenir le format OP demandé, vous auriez besoin '%m/%d/%y %h:%i %p'.
toxalot
7

Utilisez la fonction date :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Gustavo Carreno
la source
25
La fonction date () n'attend-elle pas un horodatage entier plutôt qu'un datetime spécifié dans la question?
Loftx
5

Selon votre configuration de datetime MySQL. Typiquement: 2011-12-31 au format 07:55:13 . Cette fonction très simple devrait faire la magie:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Ou un peu plus d'avance pour répondre à la question.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
tfont
la source
1
Cela ne répond pas à la question OP. OP veut prendre une date au format MySQL et la convertir en mm / jj / aa H: M (AM / PM) . De plus, cela formatera simplement l'heure actuelle, pas une date spécifique.
toxalot
5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Si vous ne voulez pas changer chaque fonction de votre code PHP, pour afficher le format de date attendu, changez-le à la source - votre base de données.

Il est important de nommer les lignes avec l' comme opérateur comme dans l'exemple ci - dessus (comme dateFrom, comme dateUntil). Les noms que vous écrivez sont les noms, les lignes seront appelées dans votre résultat.

La sortie de cet exemple sera

[Jour du mois, numérique (0..31)]. [Nom du mois (janvier..décembre)]. [Année, numérique, quatre chiffres]

Exemple: 5 août 2015

Modifiez les points avec le séparateur de votre choix et vérifiez la fonction DATE_FORMAT (date, format) pour plus de formats de date.

Rangel
la source
3

Vous pouvez également demander à votre requête de renvoyer l'heure sous forme d'horodatage Unix. Cela éliminerait le besoin d'appeler strtotime()et rendrait les choses un peu moins intensives du côté PHP ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Ensuite, en PHP, utilisez simplement la date()fonction pour le formater comme vous le souhaitez.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

ou

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

J'aime cette approche plutôt que d'utiliser la fonction de MySQLDATE_FORMAT , car elle vous permet de réutiliser la même requête pour récupérer les données et vous permet de modifier la mise en forme en PHP.

C'est ennuyeux d'avoir deux requêtes différentes juste pour changer l'apparence de la date dans l'interface utilisateur.

phatduckk
la source
J'aime l'idée d'utiliser UNIX_TIMESTAMPpour éliminer le besoin de strtotime. Cette réponse serait meilleure si elle donnait un exemple de formatage de l'heure au format OP effectivement demandé.
toxalot
1

Vous pouvez avoir des problèmes avec les dates non retournées dans l'horodatage Unix, donc cela fonctionne pour moi ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))
matt.j.crawford
la source
1
Cela ne convertit pas la date au format demandé par OP.
toxalot
1

Cela fonctionnera ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Mihir Vadalia
la source
1
Ce format se mélange 24 heures avec AM / PM. Sinon, c'est la même chose que la réponse acceptée qui a été publiée il y a plus de 5 ans.
toxalot
0

En utilisant PHP version 4.4.9 et MySQL 5.0, cela a fonctionné pour moi:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateest la colonne de MySQL .

Peter Mortensen
la source
Cela ne convertit pas la date au format demandé par OP
toxalot
0

L'approche que je propose fonctionne comme la suivante. Tout d'abord, vous créez un objet datetime de base à partir d'une chaîne au format mysql; puis vous le formatez comme vous le souhaitez. Heureusement, mysql datetime est conforme à la norme ISO8601, donc le code lui-même pourrait sembler assez simple et élégant. Gardez à l'esprit que cette datetimecolonne n'a pas d'informations de fuseau horaire, vous devez donc les convertir de manière appropriée .

Voici le code:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Il produit 01/19/2038 11:14AM- j'espère ce que vous attendez.

Cet exemple utilise la bibliothèque meringue. Vous pouvez en découvrir un peu plus si vous le souhaitez.

Vadim Samokhin
la source
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
la source
1
Cela ne répond pas à la question OP. OP veut prendre une date au format MySQL et la convertir en mm / jj / aa H: M (AM / PM) . Cela fait le contraire. De plus, il prend l'entrée d'un formulaire plutôt que de la base de données.
toxalot