提问者:小点点

用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

但我当然希望它返回当前日期,而不是破晓。 我做错了什么?


共3个答案

匿名用户

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

也可以通过除以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');