在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));
要将$date
从dd-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')