将字符串转换为Date和DateTime


292

如果我有一个PHP字符串,其格式为mm-dd-YYYY(例如10-16-2003),如何正确地将其转换为a Date,然后转换为a DateTime的格式YYYY-mm-dd?我问两个唯一的原因Date,并DateTime是因为我需要一个在一个地方,和其他在不同的地方。

Answers:


480

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或dmy格式的日期的歧义:如果分隔符为斜杠(/),则假定为美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲dmy格式。

为了避免潜在的歧义,最好尽可能使用ISO 8601(YYYY-MM-DD)日期或DateTime :: createFromFormat()。


11
这行不通。PHP将把该输入解释为DD-MM-YYYY。
马修·

我在代码中添加了一些解释,谢谢@konforce
Ibu

9
阅读下一个更好的解决方案的答案
Manuel Bitto 2013年

@delive您的日期字符串很可能不是正确的日期。
伊布

8
它不起作用,因为此答案具有误导性。strtotime接受某些格式。你什么都喂不了。这就是为什么DateTime::createFromFormat应该使用而不是的原因strtotime。可悲的是,这个答案有太多的投票让任何人都无法关注。这些天都是复制粘贴。
NB

432

您需要小心使用m / d / Y和mdY格式。PHP认为/均值m / d / Y和-均值dmY。在这种情况下,我将明确描述输入格式:

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

这样,您就不会受到某种解释的异想天开。


37
好奇为什么这不是公认的答案……这比依赖strtotime()函数的怪癖要灵活得多。
jzimmerman2011 2012年

9
重要的是要指出,PHP DateTime类自PHP版本5.2 起可用,而createFromFormat自5.3 版本起
Diego Nemo

14
与每个功能一样,您应该检查它是否符合您必须支持的最低版本。但是PHP 5.2 EOL于2011年1月发布。没有人可以再运行它。满足这些人的需求只是使他们能够运行过时的,不安全的软件。
马修(Matthew)

@Matthew是的,正确。但是你永远不会,直到今天我仍然发现仍然安装了PHP4.1版本……
Roland

29

要解析日期,您应该使用:DateTime :: 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”​​;


请注意,以这种方式检查$ dateObj只能确保格式与掩码匹配,而不能确保日期实际有效。例如,像99/99/2010这样的日期将通过此检查,因为它与m / d / Y匹配,但这不是您通常希望允许的日期。这个答案解决了这种情况-> stackoverflow.com/a/10120725/995014
Kilian Perdomo Curbelo,

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

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

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


6
我相信这会引发异常,因为16个月无效。
马修·

重要的是要指出,PHP DateTime类自PHP版本5.2 起可用,getTimestamp自5.3 版本起
Diego Nemo 2013年

2

第一次约会

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

对于新日期

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

2

如果您的格式为dd-mm-yyyy,则在PHP中将无法正常工作。在PHP文档中,它们具有以下准则。

通过查看各个组成部分之间的分隔符,可以消除m / d / y或dmy格式的日期的歧义:如果分隔符为斜杠(/),则假定为美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲dmy格式。

因此,您无法按照自己的意愿使用。当您尝试对此使用dd / mm / yyyy格式时,它将删除FALSE。您可以进行以下调整。

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

1

就像我们有日期“ 07 / May / 2018”并且我们需要日期“ 2018-05-07”一样与mysql兼容

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

这个对我有用。请享用 :)


0

既然没有人提到过,这是另一种方式:

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


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

或者,您可以使函数接受mdY并输出Ymd:

/**
 * 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'); ?>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.