最基本的
将一种日期格式转换为另一种日期格式的最简单方法是使用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()删除最后三位数字
可以用几种方法来修剪最后三位数字,但使用substr()是最简单的:
$timestamp = substr('1234567899000', -3);
substr除以1000
还可以通过除以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');