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


当前回答

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

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

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

其他回答

既然没人提到这一点,这里有另一种方法:

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

您需要小心使用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');

这样你就不会因为某个解释而心血来潮。

从任意字符串中创建日期:

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

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

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

在第一次约会时使用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格式的日期 可以通过查看 在不同的 组件:如果分隔符为a /,则美式的m/d/y为 假设;而如果分隔符是a 破折号(-)或点(.),然后是 采用欧洲d-m-y格式。 为了避免潜在的歧义,最好尽可能使用ISO 8601 (YYYY-MM-DD)日期或DateTime::createFromFormat()。