Convertir un format de date en PHP


489

J'essaie de convertir une date de yyyy-mm-ddà dd-mm-yyyy(mais pas en SQL); cependant, je ne sais pas comment la fonction date nécessite un horodatage et je ne peux pas obtenir d'horodatage de cette chaîne.

Comment est-ce possible?


22
jj-mm-aaaa est le format standard dans (la plupart) de l'Europe au moins lorsque vous devez présenter des données aux utilisateurs.
Matteo Riva

7
jj-mm-aaaa en Australie et en Nouvelle-Zélande aussi
Jonathan Day

2
mm-jj-aaaa aux USA. @stesch: le premier est standard en SQL. Je ne suis pas sûr que ce soit standard dans aucun pays. :)
Herbert

11
En fait, la norme est aaaa-mm-jj selon ISO 8601 .
Jezen Thomas

7
La «norme» globale est aaaa-mm-jj et doit toujours être utilisée par les systèmes dans la mesure du possible. Le jour de l'ordre, le mois, l'année est utilisé par les gens dans la plupart du monde (sauf aux États-Unis), mais généralement avec des barres obliques, pas des tirets. Pour éviter toute confusion, je sépare uniquement AAAA-MM-JJ par des tirets. Tout autre format de date que je séparerai avec des barres obliques. Cela maintient les choses cohérentes.
rjmunro

Réponses:


1057

Utiliser strtotime()et date():

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

(Voir la documentation strtotime et date sur le site PHP.)

Notez qu'il s'agissait d'une solution rapide à la question d'origine. Pour des conversions plus étendues, vous devriez vraiment utiliser la DateTimeclasse pour analyser et formater :-)


14
Et si j'obtiens cette date 0000-00-00 de mySQL? il renvoie une mauvaise date comme le 31/12/1969 ...
Enrique

3
@Enrique: Si vous obtenez 000-00-00 de MySQL, vous devez d'abord tester par rapport à cela avant de le soumettre à la conversion. Simples.
ShadowStorm

1
@SobinAugustine et al: strtotime () convertira la chaîne de date en "horodatage Unix (le nombre de secondes depuis le 1er janvier 1970 00:00:00 UTC)", un format date () peut comprendre puis convertir à partir de. Donc, cela ne fonctionnera pas avec un horodatage avant 1970.
Samuel Lindblom

1
@SamuelLindblom non, ce n'est pas comme ça, ça marchera avant 1970.
Sobin Augustine

1
@SobinAugustine: Vous avez raison. Il ne fonctionnera cependant pas avant le 1901-12-14, ce qui s'applique toujours aux raisons pour lesquelles les dates énumérées ci-dessus ne fonctionnent pas.
Samuel Lindblom

272

Si vous souhaitez éviter la conversion strtotime (par exemple, strtotime ne peut pas analyser votre entrée), vous pouvez utiliser,

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('d-m-Y');

Ou équivalent:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

Vous lui donnez d'abord le format $ dateString. Ensuite, vous lui indiquez le format dans lequel $ newDateString doit être.

Ou si le format source est toujours "Ymd" (aaaa-mm-jj), utilisez simplement DateTime :

<?php
    $source = '2012-07-31';
    $date = new DateTime($source);
    echo $date->format('d.m.Y'); // 31.07.2012
    echo $date->format('d-m-Y'); // 31-07-2012
?>

17
Merci pour le DateTime::createFromFormat()- c'est vraiment plus utile questrtotime()
Gtx

2
NB: PHP 5.3+ requis pour les deux premières méthodes.
Salman von Abbas

Merci pour la nouvelle option DateTime. Cela a fonctionné et était une option très propre.
Nina Morena

1
strtotime()utile pour convertir le vrai format (Ymd) en d'autres formats, mais DateTime::createFromFormat()est universel. C'est comme STR_TO_DATEdans MySQL
Taron Saribekyan

Celui-ci a vraiment fonctionné pour moi au lieu de Bullshitstrtotime()
Code Cooker

72

Utilisation:

implode('-', array_reverse(explode('-', $date)));

Sans les frais généraux de conversion de date, je ne suis pas sûr que cela importera beaucoup.


Oui, a répondu que vous avez soumis le vôtre, je crois. Bien sûr, la vérification des erreurs trouvée dans strtotime peut être utile.
Tim Lytle

2
Cela m'a été utile pour convertir un format de date non américain ... jj-mm-aaaa => aaaa-mm-jj Voir php.net/manual/en/datetime.formats.date.php
Chris Jacob

5
Ne comprenez pas pourquoi cette réponse a moins de votes. Ce devrait être la réponse la mieux notée. Il résout le problème simplement et rapidement sans aucun problème. Merci
Naeem Ul Wahhab

2
Vous pouvez même l'appeler à nouveau si vous devez inverser le format de la date dans sa forme d'origine. La meilleure réponse en effet. :)
Pedro Araujo Jorge

1
cela devrait être changé comme réponse acceptée, cela résoudra tous les problèmes de date et d'heure liés à l'utilisation des formats de date et de date.
Matteo Bononi 'peorthyr'

38
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

Ce code fonctionne pour chaque format de date.

Vous pouvez changer l'ordre des variables de remplacement telles que $ 3- $ 1- $ 2 en raison de votre ancien format de date.


Merci beaucoup!
Lê Văn Chiến

28
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

Pour plus d'informations, consultez la documentation destrtotime .

Ou encore plus court:

$new_date = date('d-m-Y', strtotime(your date variable));

27

Aussi une autre possibilité obscure:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

Je ne sais pas si je l'utiliserais mais quand même :)


1
J'ai fini par utiliser cela parce que dans notre application, les gens entreraient "99" si l'un des champs (jour, mois, année) est inconnu. Bonne approche si vous avez des "fausses" dates dans vos données.
Voodoo

18

Remarque : Parce que la réponse de ce message est parfois votée, je suis revenu ici pour demander aux gens de ne plus voter. Ma réponse est ancienne, pas techniquement correcte, et il existe plusieurs meilleures approches ici. Je ne le garde ici qu'à des fins historiques.

Bien que la documentation décrive mal la fonction strtotime, @rjmunro a correctement résolu le problème dans son commentaire: il est au format ISO date "AAAA-MM-JJ".

De plus, même si ma fonction Date_Converter peut toujours fonctionner, je tiens à vous avertir qu'il peut y avoir des instructions imprécises ci-dessous, veuillez donc ne pas en tenir compte.

La réponse la plus votée est en fait incorrecte!

Le manuel PHP strtotime indique ici que "la fonction s'attend à recevoir une chaîne contenant un format de date anglais". Ce que cela signifie en fait, c'est qu'il attend un format de date américain américain, tel que "mdY" ou "m / d / Y".

Cela signifie qu'une date fournie comme "Ymd" peut être mal interprétée par strtotime. Vous devez fournir la date dans le format attendu.

J'ai écrit une petite fonction pour renvoyer des dates dans plusieurs formats. Utilisez et modifiez à volonté. Si quelqu'un transforme cela en classe, je serais heureux que cela soit partagé.

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let's go ahead and get a string date in case we've
    # been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"] = implode(" ", $date);
        $Return["date"]["us"]     = $date[0];

        # Universal
        $Return["time"]           = $date[1];
        $Return["unix_datetime"]  = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]      = strtotime($Return["date"]["us"]);
        $Return["getdate"]        = getdate($Return["unix_datetime"]);

        # BR
        $Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]     = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;

} # End Function

2
En continuant à lire, j'aime ce que Ceiroa corrige. C'est beaucoup plus facile que d'exploser / imploser la date.
Igor Donin

3
La première réponse n'est pas incorrecte. PHP fait ce qu'il faut avec une date au format ISO "AAAA-MM-JJ". Il ne peut pas l'interpréter comme une date américaine, car il a 4 chiffres au début, et il utilise - pas / comme séparateur. Les dates ISO ont été soigneusement conçues pour ne pas être confondues avec d'autres formats.
rjmunro

14

Il existe deux façons de mettre en œuvre ceci:

1.

    $date = strtotime(date);
    $new_date = date('d-m-Y', $date);

2.

    $cls_date = new DateTime($date);
    echo $cls_date->format('d-m-Y');


8

Utilisez cette fonction pour convertir de n'importe quel format en n'importe quel format

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}

7

Ci-dessous, le code PHP pour générer la date de demain en utilisant mktime()et changer son format au format jj / mm / aaaa , puis l'imprimer en utilisant echo.

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);

5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));

1
Pour Mysql, le format de date est Ymd comme "2014-04-26"
AbdulBasit

2

Vous pouvez changer le format en utilisant la date () et le strtotime ().

$ date = '9/18/2019';

date d'écho ('dm-y', strtotime ($ date));

Résultat:

18-09-19

Nous pouvons changer le format en changeant le (dmy).


1

Pour cette conversion spécifique, nous pouvons également utiliser une chaîne de format.

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

Évidemment, cela ne fonctionnera pas pour de nombreuses autres conversions de format de date, mais comme nous ne faisons que réorganiser les sous-chaînes dans ce cas, c'est une autre façon possible de le faire.


comment convertir 2019-10-28T17: 02: 49Z en horodatage?
Bogdan Bogdanov

1
Utilisez strtotime(). :-)
Ne paniquez pas

1
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31

0

Utilisation simple strtotime()et date():

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

Avec le temps

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

Utiliser date_createetdate_format

Essaye ça.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.