从日期字符串PHP解析日期格式
我正努力做到这一点:从日期字符串PHP解析日期格式,php,date,datetime,Php,Date,Datetime,我正努力做到这一点: getFormat("Jan 2020") // returns: M Y getFormat("01 Feb 2020") // returns: d M Y getFormat("01-January-2020") // returns: d-F-Y 这个想法基本上是对php日期进行反向工程 这就是我迄今为止所尝试的: public function getFormat($date){ $date = strtolower($date); $forma
getFormat("Jan 2020") // returns: M Y
getFormat("01 Feb 2020") // returns: d M Y
getFormat("01-January-2020") // returns: d-F-Y
这个想法基本上是对php日期进行反向工程
这就是我迄今为止所尝试的:
public function getFormat($date){
$date = strtolower($date);
$formats = array(
"F" => array("january","february","march","april","may","june","july","august","september","october","november","december"),
"M" => array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"),
);
foreach($formats as $format=>$data) {
foreach($data as $d)
if (stripos($date,$d) !== false) $date = str_replace($d,$format,$date);
}
return $date;
}
这将在数月或数天内有效,但我认为这种技术永远不会对数值有效。date\u parse()检查格式中是否存在日、月和年。使用配置数组中的正则表达式将部分替换为格式字符
这不是一个完美的解决方案。这是一种可以改进的方法
function getDateFormat($format){
$parse = date_parse($format);
if($parse['error_count']) return false;
$conf = [
'~\d{4}~' => ['year','Y'],
'~[a-z]{4,8}~i' => ['month','F'],
'~[a-z]{3}~i' => ['month','M'],
'~(?<=[ /\-\.])\d{2}(?=[ /\-\.])~' => ['month','m'],
'~\d{1,2}(?=[,])~' => ['day','j'],
'~\d{2}~' => ['day','d'],
'~\d{1}~' => ['day','j'],
];
foreach($conf as $regEx => $types){
if($parse[$types[0]] !== false) {
$format = preg_replace($regEx, $types[1], $format, 1, $count);
if($count) $parse[$types[0]] = false; ;
}
}
return $format;
}
祝你好运:试试这个。你是想用它来表示日期字符串,还是同时表示日期/时间字符串?只是表示日期字符串。这些字符串将始终以月份形式显示文本<代码>12-12-12我希望不可能?我会投赞成票,但这并不能解决所有问题。例如1967年4月16日将返回fd,Y,但它可能是fj,Y,我们只是不知道。我添加了一个正则表达式,以防在这一天后面出现逗号。对于1967年4月16日这样的日期模板,我并不完全清楚该日期是用j还是d输出。就像你在12.12.12中的评论一样,还有其他无法解决的案例。
$data = [
"Jan 2020","01 Feb 2020","01-January-2020",
"2020-03-02","05.06.1987", "April 6, 1967",
"1988", "5. July 1966",
"is a Error"
];
foreach($data as $format){
$frm = getDateFormat($format);
echo $format." : ".($frm ? $frm : "ERROR")."<br>";
}
Jan 2020 : M Y
01 Feb 2020 : d M Y
01-January-2020 : d-F-Y
2020-03-02 : Y-m-d
05.06.1987 : d.m.Y
April 6, 1967 : F j, Y
1988 : Y
5. July 1966 : j. F Y
is a Error : ERROR