Converting string to Date and DateTime

PhpStringDatetimeDate

Php Problem Overview


If I have a PHP string in the format of mm-dd-YYYY (for example, 10-16-2003), how do I properly convert that to a Date and then a DateTime in the format of YYYY-mm-dd? The only reason I ask for both Date and DateTime is because I need one in one spot, and the other in a different spot.

Php Solutions


Solution 1 - Php

Use strtotime() on your first date then date('Y-m-d') to convert it back:

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

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

echo $newformat;
// 2003-10-16

Make note that there is a difference between using forward slash / and hyphen - in the strtotime() function. To quote from php.net:

> Dates in the m/d/y or d-m-y formats > are disambiguated by looking at the > separator between the various > components: if the separator is a > slash (/), then the American m/d/y is > assumed; whereas if the separator is a > dash (-) or a dot (.), then the > European d-m-y format is assumed. > > To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or DateTime::createFromFormat() when possible.

Solution 2 - Php

You need to be careful with m/d/Y and m-d-Y formats. PHP considers / to mean m/d/Y and - to mean d-m-Y. I would explicitly describe the input format in this case:

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

That way you are not at the whims of a certain interpretation.

Solution 3 - Php

To parse the date, you should use: DateTime::createFromFormat();

Ex:

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

However, careful, because this will crash with:

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

You actually need to check that the formatting went fine, first:

$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");

Now instead of crashing, you will get an exception, which you can catch, propagate, etc.

$dateDE has the wrong format, it should be "16.10.2013";

Solution 4 - Php

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

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

Edit: you can also pass a DateTimeZone to DateTime() constructor to ensure the creation of the date for the desired time zone, not the server default one.

Solution 5 - Php

Since no one mentioned this, here's another way:

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

Solution 6 - Php

To create a date from any string you can use:

$date = DateTime::createFromFormat('d-m-y H:i', '01-01-01 01:00');
echo $date->format('Y-m-d H:i');

Solution 7 - Php

If you have the date formatted as "07/May/2018" and need to make it into "2018-05-07" so that it is MySQL compatible, you can use:

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

Solution 8 - Php

For first Date

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

For New Date

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

Solution 9 - Php

If you have format dd-mm-yyyy then in PHP it won't work as expected. In PHP document they have below guideline.

> Dates in the m/d/y or d-m-y formats are disambiguated by looking at > the separator between the various components: if the separator is a > slash (/), then the American m/d/y is assumed; whereas if the > separator is a dash (-) or a dot (.), then the European d-m-y format > is assumed.

So, you just can't use as you wish. When your try to use dd/mm/yyyy format with this then it will remove FALSE. You can tweak with the following.

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

Solution 10 - Php

It worked for me to do something like:

$stringDate = "2022-02-24T17:15:00"; (if you only send the date "2022-02-24" it fills the time in 00:00:00).

$dateFormat = new DateTime($miStringDate);

Solution 11 - Php

If you wish to accept dates using American ordering (month, date, year) for European style formats (using dash or period as day, month, year) while still accepting other formats, you can extend the DateTime class:

/**
 * 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'

Or, you can make a function to accept m-d-Y and output 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'); ?>

Solution 12 - Php

If you want to get the last day of the current month you can do it with the following code.

$last_day_this_month  = date('F jS Y', strtotime(date('F t Y')));

Solution 13 - Php

I try all the above answers, but fail for me where in my case I built a function that get date string with the following format 'YYYY/mm/dd' . so i think much better to explode the string like that:

$old_date = explode('/', $coming_date_str);

$new_data = $old_date[0].'-'.$old_date[1].'-'.$old_date[2]; // this to convert the string as all the above posts and complete

$new_date = date('Y-m-d', strtotime($new_data));
$new_date = DateTime::createFromFormat("Y-m-d", new_date);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChris PinskiView Question on Stackoverflow
Solution 1 - PhpIbuView Answer on Stackoverflow
Solution 2 - PhpMatthewView Answer on Stackoverflow
Solution 3 - Phpuser2707671View Answer on Stackoverflow
Solution 4 - PhpN.B.View Answer on Stackoverflow
Solution 5 - PhpSodjView Answer on Stackoverflow
Solution 6 - PhpAzouz MohamadiView Answer on Stackoverflow
Solution 7 - PhpNewton SinghView Answer on Stackoverflow
Solution 8 - PhpVi8LView Answer on Stackoverflow
Solution 9 - PhpMAULIK MODIView Answer on Stackoverflow
Solution 10 - PhpDamian Ezequiel MarinView Answer on Stackoverflow
Solution 11 - PhpTim MortonView Answer on Stackoverflow
Solution 12 - PhpLasithdsView Answer on Stackoverflow
Solution 13 - PhpCode.kingView Answer on Stackoverflow