基础知识
将一种日期格式转换为另一种最简单的方法是使用strtotime()
与date()
。 strtotime()
会将日期转换为Unix时间戳。然后可以将该Unix时间戳传递给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'));
请记住,strtotime()
需要日期以有效格式提供。如果未提供有效格式,则会导致 strtotime()
返回 false,这将使您的日期变为 1969-12-31。
使用 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时间戳
date()
函数以Unix时间戳为第二个参数,返回格式化后的日期:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime()函数通过在时间戳前面添加@
来处理Unix时间戳:
$date = new DateTime('@1234567890')
$new_date_format = $date->format('Y-m-d H:i:s')
如果你拥有的时间戳是以毫秒为单位的(可能以000
结尾且/或时间戳长度为13个字符),在转换为另一种格式之前,你需要将其转换为秒。有两种方法可以做到这一点:
删除最后三位数字可以通过多种方式实现,但使用substr()
是最简单的方法:
$timestamp = substr('1234567899000', -3)
你也可以通过将时间戳除以1000来转换为秒。由于时间戳对于32位系统来说太大了,无法进行数学运算,因此您需要使用BCMath库以字符串方式进行运算:
$timestamp = bcdiv('1234567899000', '1000');
要获取Unix时间戳,您可以使用strtotime()
函数,它将返回一个Unix时间戳:
$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');
h
是无法识别的。h
永远不会高于12,因此输出中的H
不可能大于12。由于输入数据不好,所以无法得到好的输出数据。 - mickmackusa