我在PHP中具有以下字符串:
$date_range_create_event = "Jan 12, 2019 08:00 PM - Feb 14, 2019 06:00 AM";
我想将其分为4部分,然后可以将它们作为变量访问:
我想使它充满活力。我可以通过代码执行任何操作来自动将其分开吗?
编辑:
这是我尝试提取开始日期的方法:
$start_date = substr($date_range_create_event, 0, strpos($date_range_create_event, ' ', strpos($date_range_create_event, ' ')+1));
答案 0 :(得分:3)
您可以从字符串的每个分割部分(在-
周围)创建DateTime
对象,然后以所需的任何格式输出所需的日期/时间的任何部分结果对象:
$date_range_create_event = "Jan 12, 2019 08:00 PM - Feb 14, 2019 06:00 AM";
list($start, $end) = array_map(function ($d) { return new DateTime($d); }, explode('-', $date_range_create_event));
echo "Start date = " . $start->format('M j, Y') . "\n";
echo "Start date = " . $start->format('Y-m-d') . "\n";
echo "Start time = " . $start->format('h:i A') . "\n";
echo "Start time = " . $start->format('H:i') . "\n";
echo "End date = " . $end->format('M j, Y') . "\n";
echo "End time = " . $end->format('h:i A') . "\n";
输出:
Start date = Jan 12, 2019
Start date = 2019-01-12
Start time = 08:00 PM
Start time = 20:00
End date = Feb 14, 2019
End time = 06:00 AM
将输入解析为DateTime
对象还具有诸如简化事件持续时间的计算等优点:
$duration = $start->diff($end);
echo "Event is " . $duration->format('%h') . " hours and " . $duration->format('%i') . " minutes long\n";
输出:
Event is 10 hours and 0 minutes long
答案 1 :(得分:1)
不需要全部繁琐的正则表达式的方法就是以两种不同的方式使用explode。
首先,我们在“-”上展开不同的DateTime,然后在空间上循环并展开。
我们知道日期有3个空格,因为有年,月和日。
使用array_splice放大三个项目作为日期,然后剩下的就是时间。
$date_range_create_event = "Jan 12, 2019 08:00 PM - Feb 14, 2019 06:00 AM";
$dates = explode(" - ", $date_range_create_event);
foreach($dates as &$date){
$temp = explode(" ", $date);
$date = ["date" => implode(" ",array_splice($temp, 0,-2)), "time" => implode(" ", $temp)];
}
unset($date);
答案 2 :(得分:0)
尝试array_map('date_parse', preg_split('~\s*-\s*~', $date_range_create_event));
这给出了一个类似于下面的数组。其余的喊叫很简单。
array(2) {
[0] =>
array(12) {
'year' =>
int(2019)
'month' =>
int(1)
'day' =>
int(12)
'hour' =>
int(20)
'minute' =>
int(0)
'second' =>
int(0)
'fraction' =>
double(0)
'warning_count' =>
int(0)
'warnings' =>
array(0) {
}
'error_count' =>
int(0)
'errors' =>
array(0) {
}
'is_localtime' =>
bool(false)
}
[1] =>
array(12) {
'year' =>
int(2019)
'month' =>
int(2)
'day' =>
int(14)
'hour' =>
int(6)
'minute' =>
int(0)
'second' =>
int(0)
'fraction' =>
double(0)
'warning_count' =>
int(0)
'warnings' =>
array(0) {
}
'error_count' =>
int(0)
'errors' =>
array(0) {
}
'is_localtime' =>
bool(false)
}
}
答案 3 :(得分:0)
我们可以尝试使用正则表达式拆分和匹配的组合:
$input = "Jan 12, 2019 08:00 PM - Feb 14, 2019 06:00 AM";
$parts = preg_split ("/\s+-\s+/", $input);
foreach($parts as $date) {
if (preg_match("/([a-z]{3} \d{1,2}, \d{4}) (\d{2}:\d{2} (?:AM|PM))/i", $date, $results)) {
echo "date: " . $results[1] . "\n";
echo "time: " . $results[2] . "\n";
}
}
date: Jan 12, 2019
time: 08:00 PM
date: Feb 14, 2019
time: 06:00 AM
答案 4 :(得分:0)
如果您只想将字符串分成四个部分,则可以在一个preg_
调用中执行此操作以在两个定界符处爆炸。
代码:(Demo)
$date_range_create_event = "Feb 13, 2019 03:00 PM - Mar 1, 2019 11:00 PM";
$parts = preg_split ("/ - | (?=\d\d:)/", $date_range_create_event);
var_export($parts);
输出:
array (
0 => 'Feb 13, 2019',
1 => '03:00 PM',
2 => 'Mar 1, 2019',
3 => '11:00 PM',
)
由此,您可以使用list()
或php7 +“数组解构”将值分配给变量。
该模式显示,每次遇到时都会拆分:
(?=...)
超前使用是为了使时间子字符串不会在过程中作为定界子字符串的一部分被“消耗”。