我所拥有的:一个字符串,上面写着“2012 年 8 月 7 日星期二到 2012 年 8 月 28 日星期二”
我想要的:一个字符串,上面写着“8 月 7 日 - 8 月 28 日”
唯一的问题是有时我将其作为字符串:
“2012 年 8 月 31 日星期五晚上 7:30 至晚上 9:30”
结果我需要这个:“Aug 31”
这是来自 Google 日历提要的信息,因此传入的字符串会根据用户是否输入开始时间等而有所不同。感谢您的帮助!
我所拥有的:一个字符串,上面写着“2012 年 8 月 7 日星期二到 2012 年 8 月 28 日星期二”
我想要的:一个字符串,上面写着“8 月 7 日 - 8 月 28 日”
唯一的问题是有时我将其作为字符串:
“2012 年 8 月 31 日星期五晚上 7:30 至晚上 9:30”
结果我需要这个:“Aug 31”
这是来自 Google 日历提要的信息,因此传入的字符串会根据用户是否输入开始时间等而有所不同。感谢您的帮助!
$string = 'Fri Aug 31, 2012 7:30pm to 9:30pm';
$pieces = explode(' to ', $string);
$d1 = strtotime($pieces[0]);
if(isset($pieces[1])) {
$d2 = strtotime($pieces[1]);
if(date('M j', $d1) == date('M j', strtotime($pieces[1], $d1))) {
echo date('M j', $d1);
}
else echo date('M j', $d1) . " - " . date('M j', $d2);
}
else {
echo date('M j', $d1);
}
结果: 8月31日
$string = 'Tue Aug 7, 2012 to Tue Aug 28, 2012';
结果: 8 月 7 日 - 8 月 28 日
$string = 'Tue Aug 7, 2012';
结果: 8月7日
您可以使用该preg_match_all
函数使逻辑更容易:
$str1 = "Tue Aug 7, 2012 to Tue Aug 28, 2012";
$str2 = "Fri Aug 31, 2012 7:30pm to 9:30pm";
$pattern = '/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d+/';
$numMatches = preg_match_all($pattern, $str1, $dates);
if ($numMatches == 1) // case 2
echo $dates[0][0];
else // case 1
echo $dates[0][0]." - ".$dates[0][1];
preg_match_all
DEMO(在测试用例 2中将 $str1 更改为 $str2 )
MON D
只要格式或MON DD
字符串中有一个或多个日期,这将起作用。字符串的其余部分如何格式化并不重要,只要存在月份和日期即可。
检查此变体:
$in = "2012 年 8 月 7 日星期二至 2012 年 8 月 28 日星期二"; //$in = "2012 年 8 月 31 日星期五晚上 7:30 到凌晨 4:30";
$reg = '~(\w{3}) (\w{3}) (\d{1,2}), (\d{4}) (\d{1,2}:\d{2}(?:pm|am) )?to (?:(\w{3}) (\w{3}) (\d{1,2}), (\d{4})|(\d{1,2}:\d{2}(?:pm|am)))~i';
$in = preg_replace_callback($reg, function($m) {
if (!$m[6] && !$m[9]) {
return "{$m[2]} {$m[3]}";
}
else return "{$m[2]} {$m[3]} - {$m[7]} {$m[8]}";
}, $in);
echo $in;
为"Tue Aug 7, 2012 to Tue Aug 28, 2012"
印刷品Aug 7 - Aug 28
,为"Fri Aug 31, 2012 7:30pm to 4:30am"
你得到Aug 31
。