在PHP中将一种date格式转换成另一种格式

有一种简单的方法来在PHP中将一个date格式转换成另一种date格式?

我有这个:

$old_date = date('ymdhi-s'); // works $middle = strtotime($old_date); // returns bool(false) $new_date = date('Ymd H:i:s', $middle); // returns 1970-01-01 00:00:00 

但我当然希望它能够返回一个当前的date而不是破晓时分。 我究竟做错了什么?

date()的第二个参数需要是一个适当的时间戳(1970年1月1日以来的秒数)。 您正在传递一个string,该date()无法识别。

您可以使用strtotime()将datestring转换为时间戳。 但是,即使strtotime()也不能识别ymdhis格式。

PHP 5.3及以上

使用DateTime::createFromFormat 。 它允许你指定一个确切的掩码 – 使用date()语法 – 来parsing传入的stringdate。

PHP 5.2和更低

您将不得不手动使用substr()分析元素(年,月,日,小时,分钟,秒substr() ,并将结果交给mktime() ,这会为您创build一个时间戳。

但是这是很多工作! 我build议使用strftime()可以理解的不同格式。 strftime()理解任何dateinput短the next time joe will slip on the ice 。 例如,这工作:

 $old_date = date('l, F dyh:i:s'); // returns Saturday, January 30 10 02:06:34 $old_date_timestamp = strtotime($old_date); $new_date = date('Ymd H:i:s', $old_date_timestamp); 

最简单的方法是

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

你首先给它的格式是$ dateString。然后你告诉它你想要$ newDateString的格式。

这也避免了使用时间,这可能有时难以工作。

如果您不是从一种date格式转换为另一种date格式,而只是希望使用特定格式的当前date(或date时间),那么更容易:

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

这个其他的问题也是指同一个主题: 转换date格式yyyy-mm-dd => dd-mm-yyyy 。

基础

将一种date格式转换成另一种date格式的简单方法是在date()使用strtotime() date()strtotime()会将date转换为Unix时间戳 。 那Unix时间戳然后可以被传递给date()把它转换成新的格式。

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

或者作为一个单线:

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

请记住, strtotime()要求date的格式是有效的 。 未能提供有效的格式将导致strtotime()返回false,这将导致您的date为1969-12-31。

使用DateTime()

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

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

使用Unix时间戳

date()以Unix时间戳作为第二个参数,并为您返回一个格式化的date:

 $new_date_format = date('Ymd H:i:s', '1234567890'); 

DateTime()通过在时间戳之前添加@处理Unix时间戳:

 $date = new DateTime('@1234567890'); $new_date_format = $date->format('Ymd H:i:s'); 

如果您拥有的时间戳以毫秒为单位(可能以000结尾和/或时​​间戳长度为十三个字符),则需要将其转换为秒后才能将其转换为其他格式。 有两种方法可以做到这一点:

  • 使用substr()修剪最后三位数字

修剪最后三位数字可以通过几种方法实现,但使用substr()是最简单的:

 $timestamp = substr('1234567899000', -3); 
  • 将substr除以1000

您也可以将时间戳转换为秒,除以1000.由于时间戳对32位系统来说过于庞大,因此您需要使用BCMath库以stringforms进行计算:

 $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(); 

如果您正在运行PHP 5.2,则可以使用U格式选项:

 $date = new DateTime('2008-07-01T22:35:17.02'); $timestamp = $date->format('U'); 

使用非标准和不明确的date格式

不幸的是,并非所有开发人员必须使用的date都是标准格式。 幸运的是PHP 5.3为我们提供了一个解决scheme。 DateTime::createFromFormat()允许我们告诉PHPdatestring是什么格式,所以它可以被成功parsing成DateTime对象进一步操作。

 $date = DateTime::createFromFormat('FdY h:i A', 'April-18-1973 9:48 AM'); $new_date_format = $date->format('Ymd H:i:s'); 

在PHP 5.4中,我们获得了对实例化进行类成员访问的能力,这使得我们可以将DateTime()代码转换为一行代码:

 $new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Ymd H:i:s'); $new_date_format = DateTime::createFromFormat('FdY h:i A', 'April-18-1973 9:48 AM')->format('Ymd H:i:s'); 

尝试这个:

 $old_date = date('ymdhi-s'); $new_date = date('Ymd H:i:s', strtotime($old_date)); 

要将$datedd-mm-yyyy hh:mm:ss转换为适当的MySQLdate时间,我可以这样做:

 $date = DateTime::createFromFormat('dmY H:i:s',$date)->format('Ymd H:i:s'); 
 $old_date = date('ymdhi-s'); // works 

你在这里做错了,这应该是

 $old_date = date('ymd h:i:s'); // works 

时间分隔符是':'


我认为这将有助于…

 $old_date = date('ymdhi-s'); // works preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER); $out = $out[0]; $time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $new_date = date('Ymd H:i:s', $time); 

要么


 $old_date = date('ymdhi-s'); // works $out = explode('-', $old_date); $time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]); $new_date = date('Ymd H:i:s', $time); 

以下是将date转换为不同格式的简单方法。

 // Create a new DateTime object $date = DateTime::createFromFormat('Ym-d', '2016-03-25'); // Output the date in a different format echo $date->format('Ym-d'); 

strtotime将解决这个问题。 date是不一样的,都在我们的格式。

 <?php $e1 = strtotime("2013-07-22T12:00:03Z"); echo date('ymd H:i', $e1); echo "2013-07-22T12:00:03Z"; $e2 = strtotime("2013-07-23T18:18:15Z"); echo date ('ymd H:i', $e2); echo "2013-07-23T18:18:15Z"; $e1 = strtotime("2013-07-21T23:57:04Z"); echo date ('ymd H:i', $e2); echo "2013-07-21T23:57:04Z"; ?> 

您需要将$ old_date转换回时间戳,因为date函数需要时间戳作为其第二个参数。

尝试这个:

 $tempDate = explode('-','03-23-15'); $date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1]; 

这是您可以转换date格式的另一种方式

  <?php $pastDate = "Tuesday 11th October, 2016"; $pastDate = str_replace(",","",$pastDate); $date = new DateTime($pastDate); $new_date_format = $date->format('Ym-d'); echo $new_date_format.' 23:59:59'; ?> 

只是使用string,对我来说是一个很好的解决scheme,减less了与MySQL的问题。 检测当前格式并在必要时进行更改,此解决scheme仅适用于西class牙文/法文格式和英文格式,而不使用phpdate时间function。

 class dateTranslator { public static function translate($date, $lang) { $divider = ''; if (empty($date)){ return null; } if (strpos($date, '-') !== false) { $divider = '-'; } else if (strpos($date, '/') !== false) { $divider = '/'; } //spanish format DD/MM/YYYY hh:mm if (strcmp($lang, 'es') == 0) { $type = explode($divider, $date)[0]; if (strlen($type) == 4) { $date = self::reverseDate($date,$divider); } if (strcmp($divider, '-') == 0) { $date = str_replace("-", "/", $date); } //english format YYYY-MM-DD hh:mm } else { $type = explode($divider, $date)[0]; if (strlen($type) == 2) { $date = self::reverseDate($date,$divider); } if (strcmp($divider, '/') == 0) { $date = str_replace("/", "-", $date); } } return $date; } public static function reverseDate($date) { $date2 = explode(' ', $date); if (count($date2) == 2) { $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1]; } else { $date = implode("-", array_reverse(preg_split("/\D/", $date))); } return $date; } 

使用

 dateTranslator::translate($date, 'en')