在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
但我当然希望它返回当前日期,而不是破晓。 我做错了什么?
date()
的第二个参数需要是正确的时间戳(1970年1月1日以来的秒数)。 您传递的是一个date()无法识别的字符串。
您可以使用strtotime()将日期字符串转换为时间戳。 但是,即使strtotime()也不能识别y-m-d-h-i-s
格式。
PHP 5.3及更高版本
使用DateTime::CreateFromFormater
。 它允许您使用date()
语法指定一个确切的掩码来解析传入的字符串日期。
PHP 5.2及更低版本
您必须使用substr()
手动解析元素(年,月,日,小时,分钟,秒),并将结果交给mktime(),mktime()将为您构建一个时间戳。
但那可是很多工作啊! 我建议使用strftime()可以理解的不同格式。 strftime()可以理解以外的任何日期输入,下次joe将在冰上滑倒
。 例如,这是有效的:
$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。
如果您不是从一种日期格式转换到另一种格式,而只是希望当前日期(或日期时间)为特定格式,那么就更容易了:
$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');
另一个问题也涉及同一主题:转换日期格式yyyy-mm-dd=>; DD-MM-YYYY。
基础知识
将一种日期格式转换为另一种格式的简单方法是将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 timeatamp作为其第二个参数,并为您返回格式化日期:
$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);
也可以通过除以1000将时间戳转换为秒。 由于时间戳对于32位系统来说太大,无法进行数学运算,因此需要使用BCMath库以字符串的形式进行数学运算:
$timestamp = bcdiv('1234567899000', '1000');
要获取Unix时间戳,可以使用返回Unix时间戳的strToTime()
:
$timestamp = strtotime('1973-04-18');
使用DateTime()可以使用DateTime::getTimeStamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
如果您正在运行PHP5.2,则可以使用u
格式化选项:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
使用非标准和不明确的日期格式
不幸的是,并非开发人员必须处理的所有日期都是标准格式的。 幸运的是,PHP5.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');