在 PHP 中将一个日期格式转换为另一个日期格式

在 PHP 中,有没有一种简单的方法将一种日期格式转换为另一种日期格式?
看这儿:

$old_date = date('y-m-d-h-i-s');            // works
$middle = strtotime($old_date);             // returns bool(false)
$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00

但是我当然希望它返回一个当前的日期。哪儿不对?

strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳
//如下
$old_date = date('y-m-d-h-i-s');
$date = DateTime::createFromFormat('y-m-d-h-i-s', $old_date);
echo $date->format('Y-m-d');

Date ()的第二个参数需要是一个正确的timestamp(自1970年1月1日以来的秒)。 您正在传递一个 date() 无法识别的字符串。
可以使用 strtotime ()将日期字符串转换为 timestamp。 但是,即使是 strtotime ()也不能识别 y-m-d-h-i-s 格式。
PHP 5.3及以上版本
DateTime::createFromFormat
它允许使用 date ()语法指定一个精确的掩码来解析传入的字符串日期。
PHP 5.2及以下版本
您必须使用 substr ()手动解析元素(年、月、日、小时、分钟、秒) ,并将结果给mktime() ,它将为您构建一个timestamp。
但是工作量大! 我建议使用 strftime ()能够理解的不同格式。 Strftime ()能够理解任何日期输入,最多也就是不懂这个the next time joe will slip on the ice
例如,这个方法可行:

$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);

最简单的方法就是

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');

首先给出 $dateString 所使用的格式。 然后您告诉它您希望 $newDateString 采用的格式。
这也避免了 strtotime 的使用,有时候 strtotime 很难处理。
如果您不是从一种日期格式转换到另一种日期格式,而只是希望将当前日期(或日期时间)转换为特定格式,那么更简单:

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

基本知识
将一种日期格式转换为另一种格式的简单方法是使用带 date ()的 strtotime ()。 Strtotime ()将把日期转换为 Unix Timestamp。 然后,可以将该 Unix Timestamp传递给 date () ,以将其转换为新格式。

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

或者:

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

用DateTime()
在 PHP 5.2中,PHP 提供了 DateTime ()类,它为我们提供了处理日期(和时间)的更强大的工具。 我们可以使用 DateTime ()重写上面的代码,如下所示:

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

用 Unix timestamps
Date ()接受一个 Unix timeatamp 作为它的第二个参数,并返回一个格式化的日期:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime() works with Unix timestamps by adding an @ before the timestamp:
Datetime ()通过在timestamp之前添加@来使用Unix timestamp:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
如果时间戳以毫秒为单位(可能以000结束,或者时间戳长达十三个字符) ,你需要将其转换为秒,然后才能将其转换为另一种格式。有两种方法可以做到这一点:
改后三位数字可以有几种方法,但是使用 substr ()是最简单的:
$timestamp = substr('1234567899000', -3);
还可以将时间戳除以1000,将其转换为秒。 因为时间戳对于32位系统来说太大了,所以你需要使用 BCMath 库来计算字符串:
$timestamp = bcdiv('1234567899000', '1000');
要获得 Unix Timestamp ,可以使用 strtotime () ,它返回一个 Unix Timestamp:
$timestamp = strtotime('1973-04-18');
使用 DateTime ()可以使用 DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
如果你正在运行 PHP 5.2,你可以改用 u 格式选项:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
使用非标准和不明确的日期格式
可惜,并非所有开发人员必须处理的日期都是标准格式的。好在PHP 5.3为我们提供了一个解决方案。 Datetime: : createFromFormat ()允许我们告诉 PHP 日期字符串的格式,以便成功地将其解析为 DateTime 对象进行进一步操作。
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
在 PHP 5.4中,我们获得了在实例化时进行类成员访问的能力,这使得我们可以将 DateTime ()代码转换为一行程序:
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');