将字符串转换为Date和DateTime

时间:2011-06-04 19:46:07

标签: php string datetime date

如果我的格式为mm-dd-YYYY的PHP字符串(例如,10-16-2003),如何将其正确转换为Date然后DateTime格式为YYYY-mm-dd?我要求DateDateTime的唯一原因是因为我需要一个在一个位置,另一个在另一个位置。

12 个答案:

答案 0 :(得分:414)

在第一个日期使用strtotime(),然后date('Y-m-d')将其转换回来:

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

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

echo $newformat;
// 2003-10-16

请注意,在strtotime()函数中使用正斜杠/和连字符-之间存在差异。引用php.net:

  

日期为m / d / y或d-m-y格式   通过观察来消除歧义   各种之间的分隔符   组件:如果分隔符是   斜线(/),然后是美国的m / d / y   假定;而如果分隔符是a   破折号( - )或点(。),然后是   假设欧洲d-m-y格式。

答案 1 :(得分:392)

您需要注意m / d / Y和m-d-Y格式。 PHP认为/表示m / d / Y,-表示d-m-Y。在这种情况下我会明确描述输入格式:

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

这样你就不会有某种解释的想法。

答案 2 :(得分:26)

要解析日期,您应该使用:     日期时间:: createFromFormat();

例如:

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

但是,小心,因为这会崩溃:

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

您实际上需要检查格式是否正常,首先:

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

现在,您将获得一个异常,而不是崩溃,您可以捕获,传播等等。

$ dateDE格式错误,应为" 16.10.2013";

答案 3 :(得分:22)

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

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

编辑:您还可以将DateTimeZone传递给DateTime()构造函数,以确保创建所需时区的日期,而不是服务器的默认日期。

答案 4 :(得分:1)

第一个日期

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

新日期

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

答案 5 :(得分:1)

如果您的格式为dd-mm-yyyy,那么在PHP中它将无法按预期工作。在PHP文档中,他们有以下指南。

  

通过查看,可以消除m / d / y或d-m-y格式的日期   各个组件之间的分隔符:如果分隔符是a   斜线(/),然后是美国m / d / y;而如果   separator是短划线( - )或点(。),然后是欧洲d-m-y格式   假定。

所以,你根本就不能按照自己的意愿使用。当您尝试使用dd / mm / yyyy格式时,它将删除FALSE。您可以使用以下内容进行调整。

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

答案 6 :(得分:0)

就像我们有日期“ 07 / May / 2018”一样,我们需要日期“ 2018-05-07”是与MySQL兼容的

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

对我有用。享受:)

答案 7 :(得分:0)

由于没有人提及此,这是另一种方式:

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

答案 8 :(得分:0)

如果您希望接受采用美式排序(月,日,年)的日期作为欧洲格式的日期(使用破折号或句点作为日,月,年),最简单的解决方案是用斜杠替换破折号或句点

您可以扩展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 non-European formats
 * 
 */
class AmericanDateTime extends DateTime {
  public function __construct(string $time="now", DateTimeZone $timezone = null) {
    // substr avoids microtime error
    $time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );
    parent::__construct($time, $timezone);
  }
}

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

// => '2019-07-24'

或者,您可以使函数接受m-d-Y并输出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'); ?>

答案 9 :(得分:0)

要使用任何字符串创建日期,请使用:
$ date = DateTime :: createFromFormat('d-m-y H:i','01 -01-01 01:00'); echo $ date-> format('Y-m-d H:i');

答案 10 :(得分:0)

如果要获取当月的最后一天,可以使用以下代码来完成。

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

答案 11 :(得分:0)

我尝试了上述所有答案,但失败了,在我的情况下,我构建了一个获取日期字符串的函数,其格式为 'YYYY/mm/dd' 。所以我认为像这样分解字符串会更好:

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

$new_data = $old_date[0].'-'.$old_date[1].'-'.$old_date[2]; // 将字符串转换为上述所有帖子并完成

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