Conversion d'un format de date en un autre en PHP

Existe-t-il un moyen simple de convertir un format de date en un autre format de date en PHP?

j'ai ceci:

$old_date = date('y-m-d-h-i-s');            // works

$middle = strtotime($old_date);             // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00

mais je voudrais bien sûr qu'il renvoie une date actuelle plutôt que l'aube. Ce que je fais mal?

278
demandé sur Vadim Kotov 2010-01-30 15:58:56

14 réponses

le second paramètre de date() doit être un timestamp correct (secondes depuis le 1er janvier 1970). Vous passez une chaîne de caractères, que date () ne peut pas reconnaître.

vous pouvez utiliser strtotime () pour convertir une chaîne de date en horodatage. Cependant, même strtotime () ne reconnaît pas le format y-m-d-h-i-s .

PHP 5.3 et plus

Use DateTime::createFromFormat . Il vous permet de spécifier un masque exact - en utilisant la syntaxe date() - pour analyser les dates des chaînes entrantes.

PHP 5.2 et inférieur

vous devrez analyser les éléments (Année, Mois, Jour, Heure, minute, Seconde) manuellement en utilisant substr() et remettre les résultats à mktime () qui vous construira un horodatage.

Mais c'est beaucoup de travail! Je recommande d'utiliser un format différent que strftime () peut comprendre. strftime() comprend tout date d'entrée court de the next time joe will slip on the ice . par exemple, cela fonctionne:

$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);   
248
répondu Pekka 웃 2010-10-06 13:11:04

la façon la plus facile de faire ceci est

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

vous lui donnez d'abord le format $dateString est en. Alors vous lui dites le format dans lequel vous voulez que $newDateString soit.

cela évite également l'utilisation de strtotime, qui peut être difficile à travailler à certains moments.

si vous n'êtes pas en train de passer d'un format de date à un autre, mais que vous voulez simplement la date actuelle (ou datetime) dans un format spécifique, alors c'est encore plus facile:

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

cette autre question renvoie aussi au même sujet: convertir la date format AAAA-mm-JJ => JJ-mm-AAAA .

86
répondu ceiroa 2017-05-23 12:10:27

Les Bases

la façon simplist de convertir un format de date en un autre est d'utiliser strtotime() avec date() . strtotime() convertira la date en Timestamp Unix . Ce Timestamp Unix peut alors être passé à date() pour le convertir au nouveau format.

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

ou sous forme d'une doublure:

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

gardez à l'esprit que strtotime() exige que la date soit dans un format valide . Si vous ne fournissez pas un format valide, strtotime() retournera false, ce qui fera que votre date sera 1969-12-31.

utilisant DateTime()

à partir de PHP 5.2, PHP a offert la classe DateTime() qui nous offre des outils plus puissants pour travailler avec les dates (et l'heure). Nous pouvons réécrire le code ci-dessus en utilisant DateTime() comme suit:

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

travailler avec des horodateurs Unix

date() prend un timeatamp Unix comme second paramètre et retourne une date formatée pour vous:

$new_date_format = date('Y-m-d H:i:s', '1234567890');

DateTime () fonctionne avec les horodateurs Unix en ajoutant un @ avant l'horodateur:

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

Si le timestamp que vous avez est en millisecondes (il peut se terminer en 000 et/ou le timestamp est de treize caractères long), vous aurez besoin de le convertir en secondes avant de pouvoir le convertir dans un autre format. Il y a deux façons de le faire:

  • couper les trois derniers chiffres en utilisant substr()

rogner les trois derniers chiffres peut être obtenu de plusieurs façons, mais en utilisant substr() est le plus facile:

$timestamp = substr('1234567899000', -3);
  • diviser le substr par 1000

vous pouvez également convertir l'horodatage en secondes en divisant par 1000. Parce que l'horodatage est trop grand pour les systèmes 32 bits pour faire des maths sur vous aurez besoin d'utiliser la BCMath bibliothèque pour faire les maths comme les chaînes de caractères:

$timestamp = bcdiv('1234567899000', '1000');

pour obtenir un Timestamp Unix vous pouvez utiliser strtotime() qui renvoie un timestamp Unix:

$timestamp = strtotime('1973-04-18');

avec DateTime () vous pouvez utiliser DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();

si vous utilisez PHP 5.2, vous pouvez utiliser l'option de formatage U à la place:

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

"1519320920 de Travail" non-standard et ambiguës, les formats de date

Malheureusement, toutes les dates avec lesquelles un développeur doit travailler ne sont pas dans un format standard. Heureusement PHP 5.3 nous a fourni une solution pour cela. DateTime::createFromFormat() " nous permet de dire à PHP dans quel format est une chaîne de date afin qu'elle puisse être analysée avec succès dans un objet DateTime pour une manipulation ultérieure.

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');

en PHP 5.4 nous avons gagné la capacité de faire l'accès de membre de classe sur instanciation a été ajouté qui nous permet de transformer notre DateTime() code en une doublure:

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
40
répondu John Conde 2016-12-15 16:23:42

essayez ceci:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
24
répondu Sarfraz 2010-01-30 13:01:53

pour convertir $date de dd-mm-yyyy hh:mm:ss en une datetime MySQL appropriée Je vais comme ceci:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
12
répondu Jelle de Fries 2017-08-18 08:48:33
$old_date = date('y-m-d-h-i-s');       // works

vous faites mal ici, ce doit être

$old_date = date('y-m-d h:i:s');       // works

séparateur de temps est -': '


je pense que cela aidera...

$old_date = date('y-m-d-h-i-s');              // works

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time); 

ou


$old_date = date('y-m-d-h-i-s');              // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time); 
9
répondu Rifat 2010-01-30 15:13:50

ce qui suit est une méthode facile pour convertir des dates en différents formats.

// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";
9
répondu Peter 2018-01-19 07:09:24

vous avez besoin de convertir le $old_date de nouveau dans un timestamp, comme la date Fonction exige un timestamp comme son deuxième argument.

6
répondu John Parker 2010-01-30 13:01:44

strtotime va arranger ça. les dates ne sont tout simplement pas les mêmes et tous dans le format us.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
6
répondu de_nuit 2013-07-23 21:10:34

essayez ceci:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
4
répondu vineet 2017-06-06 07:36:47

cette façon native aidera à convertir n'importe quel format saisi au format désiré.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
2
répondu Nishad Up 2018-02-07 08:38:35

Cela a résolu pour moi,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

sortie: 2018-04-18

2
répondu Arthi Rajgopal 2018-04-04 18:34:55

c'est l'autre façon que vous pouvez convertir le format de date

 <?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>
1
répondu Varun Malhotra 2017-06-06 07:22:01

juste utiliser des cordes, pour moi c'est une bonne solution, moins de problèmes avec mysql. Détecte le format actuel et le modifie si nécessaire, Cette solution est uniquement disponible pour le format espagnol/français et le format anglais, sans utiliser la fonction php datetime.

class dateTranslator {

 public static function translate($date, $lang) {
      $divider = '';

      if (empty($date)){
           return null;   
      }
      if (strpos($date, '-') !== false) {
           $divider = '-';
      } else if (strpos($date, '/') !== false) {
           $divider = '/';
      }
      //spanish format DD/MM/YYYY hh:mm
      if (strcmp($lang, 'es') == 0) {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 4) {
                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '-') == 0) {
                $date = str_replace("-", "/", $date);
           }
      //english format YYYY-MM-DD hh:mm
      } else {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 2) {

                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '/') == 0) {
                $date = str_replace("/", "-", $date);

           }   
      }
      return $date;
 }

 public static function reverseDate($date) {
      $date2 = explode(' ', $date);
      if (count($date2) == 2) {
           $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
      } else {
           $date = implode("-", array_reverse(preg_split("/\D/", $date)));
      }

      return $date;
 }

UTILISER

dateTranslator::translate($date, 'en')
0
répondu Alejandro Aranda 2017-09-01 08:02:25