将字符串转换为Date和DateTime

Chr*_*ski 273 php string datetime date

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

Ibu*_*Ibu 451

使用strtotime()你的第一次约会,然后date('Y-m-d')将其转换回:

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

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

echo $newformat;
// 2003-10-16
Run Code Online (Sandbox Code Playgroud)

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

通过查看各个组件之间的分隔符来消除m/d/y或dmy格式的日期:如果分隔符是斜杠(/),则假设为美国m/d/y; 而如果分隔符是破折号( - )或点(.),则假定为欧洲dmy格式.

  • 这不行.PHP会将该输入解释为DD-MM-YYYY. (10认同)
  • 阅读下一个答案以获得更好的解决方 (9认同)
  • 它不起作用,因为这个答案有误导性.`strtotime`接受某些格式.你不能喂它.这就是为什么应该使用`DateTime :: createFromFormat`而不是`strtotime`.可悲的是,这个答案有太多的赞成,任何人都不应该关注.这些天都是复制粘贴. (6认同)

Mat*_*hew 414

您需要注意m/d/Y和mdY格式.PHP认为/是指m/d/Y,-意思是dmY.在这种情况下,我会明确描述输入格式:

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

这样你就不会有某种解释的心血来潮.

  • 好奇为什么这不是公认的答案......这比依赖于`strtotime()`函数的怪癖要灵活得多. (36认同)
  • 与每个功能一样,您应该检查它是否符合您必须支持的最低版本.但PHP 5.2 EOL是2011年1月.没有人应该再运行它了; 迎合这些人只是让他们能够运行过时的,不安全的软件. (14认同)
  • 重要的是要指出php**DateTime**类自PHP版本5.2起可用,而_createFromFormat_自5.3起 (9认同)

use*_*671 27

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

例如:

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

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

PHP Fatal error: Call to a member function format() on a non-object 
Run Code Online (Sandbox Code Playgroud)

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

$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");
Run Code Online (Sandbox Code Playgroud)

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

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


N.B*_*.B. 22

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

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

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

  • 我相信这会引发异常,因为第16个月无效. (6认同)

小智 10

要从任何字符串创建日期,您可以使用:

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


Sod*_*odj 9

由于没有人提到这一点,这是另一种方式:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");
Run Code Online (Sandbox Code Playgroud)