web-dev-qa-db-fra.com

Conversion de chaîne en Date et DateTime

Si j'ai une chaîne PHP au format mm-dd-YYYY (par exemple, 10-16-2003), comment la convertir correctement en un Date puis un DateTime au format YYYY-mm-dd? La seule raison pour laquelle je demande à la fois Date et DateTime, c'est parce que j'ai besoin de l'un à un endroit et de l'autre à un endroit différent.

241
Chris Pinski

Utilisez strtotime() à votre première date, puis date('Y-m-d') pour le reconvertir:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

Notez qu'il existe une différence entre l'utilisation de la barre oblique / et du trait d'union - dans la fonction strtotime() . Pour citer php.net:

Dates aux formats m/j/a ou d-m-y sont désambiguïsés en regardant le séparateur entre les divers composants: si le séparateur est un slash (/), alors l’américain m/d/y est assumé; alors que si le séparateur est un tiret (-) ou un point (.), puis le Le format européen d-m-y est supposé.

397
Ibu

Vous devez faire attention avec les formats m/d/Y et m-d-Y. PHP considère que / signifie m/d/Y et - signifie d-m-Y. Je décrirais explicitement le format d'entrée dans ce cas:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

De cette façon, vous n'êtes pas à la merci d'une certaine interprétation.

373
Matthew

Pour analyser la date, vous devez utiliser: DateTime :: createFromFormat ();

Ex:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

Attention toutefois, car cela plantera avec:

PHP Fatal error: Call to a member function format() on a non-object 

Vous devez en fait vérifier que le formatage s'est bien passé, en premier lieu:

$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
    throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");

Maintenant, au lieu de planter, vous obtiendrez une exception que vous pourrez attraper, propager, etc.

$ dateDE a le mauvais format, il devrait être "16.10.2013";

24
user2707671
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

Edit: vous pouvez également passer un constructeur DateTimeZone à DateTime () pour garantir la création de la date pour le fuseau horaire souhaité, et non celle par défaut du serveur.

21
N.B.

Si vous avez le format jj-mm-aaaa, alors dans PHP, cela ne fonctionnera pas comme prévu. Dans le document PHP, ils ont une ligne directrice inférieure. 

Les dates dans les formats m/j/a ou d-m-y sont désambiguïsées en regardant le séparateur entre les différents composants: si le séparateur est un slash (/), alors l’américain m/d/y est supposé; alors que si le Le séparateur est un tiret (-) ou un point (.), puis le format européen d-m-y est assumé.

Donc, vous ne pouvez pas utiliser comme vous le souhaitez. Lorsque vous essayez d’utiliser le format jj/mm/aaaa avec cela, il supprime FALSE. Vous pouvez Tweak avec ce qui suit.

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
1
MAULIK MODI

Pour la première date

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

Pour une nouvelle date

$_newDate = date("Y-m-d",strtotime($_yourDateString));
1
Vi8L

Comme nous avons la date "07/May/2018" et nous avons besoin de la date "2018-05-07" compatible avec mysql 

if (!empty($date)) {
    $timestamp = strtotime($date);
    if ($timestamp === FALSE) {
         $timestamp = strtotime(str_replace('/', '-', $date));
     }
         $date = date('Y-m-d', $timestamp);
  }

Ça marche pour moi. prendre plaisir :)

0
Newton Singh

Puisque personne n'en a parlé, voici une autre façon:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");

0
Sodj

Si vous souhaitez accepter les dates en utilisant la commande américaine (mois, date, année) pour les formats de style européen (en utilisant un tiret ou une période comme jour, mois, année) tout en acceptant d'autres formats , vous pouvez étendre la classe DateTime:

/**
 * Quietly convert European format to American format
 *
 * Accepts m-d-Y, m-d-y, m.d.Y, m.d.y, Y-m-d, Y.m.d
 * as well as all other built-in formats
 * 
 */
class CustomDateTime extends DateTime 
{
  public function __construct(string $time="now", DateTimeZone $timezone = null) 
  {
    // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y (substr avoids microtime error)
    $time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );

    parent::__construct($time, $timezone);
  }
}

// usage:
$date = new CustomDateTime('7-24-2019');
print $date->format('Y-m-d');

// => '2019-07-24'

Ou, vous pouvez créer une fonction pour accepter m-d-Y et générer une sortie Y-m-d:

/**
 * Accept dates in various m, d, y formats and return as Y-m-d
 * 
 * Changes PHP's default behaviour for dates with dashes or dots.
 * Accepts:
 *   m-d-y, m-d-Y, Y-m-d,
 *   m.d.y, m.d.Y, Y.m.d,
 *   m/d/y, m/d/Y, Y/m/d,
 *   ... and all other formats natively supported 
 * 
 * Unsupported formats or invalid dates will generate an Exception
 * 
 * @see https://www.php.net/manual/en/datetime.formats.date.php PHP formats supported
 * @param  string $d various representations of date
 * @return string    Y-m-d or '----' for null or blank
 */
function asYmd($d) {
  if(is_null($d) || $d=='') { return '----'; }

  // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y
  $d = str_replace(['-','.'], '/', $d);

  return (new DateTime($d))->format('Y-m-d');
}

// usage:

<?= asYmd('7-24-2019') ?>

// or

<?php echo asYmd('7-24-2019'); ?>
0
Tim Morton