分隔一长串日期和时间

时间:2019-01-13 05:10:54

标签: php regex str-replace

我在PHP中具有以下字符串:

$date_range_create_event = "Jan 12, 2019 08:00 PM - Feb 14, 2019 06:00 AM";

我想将其分为4部分,然后可以将它们作为变量访问:

  • 开始日期(2019年1月12日)
  • 开始时间(08:00 PM)
  • 结束日期(2019年2月14日)
  • 结束时间(06:00 AM)

我想使它充满活力。我可以通过代码执行任何操作来自动将其分开吗?

编辑:

这是我尝试提取开始日期的方法:

$start_date = substr($date_range_create_event, 0, strpos($date_range_create_event, ' ', strpos($date_range_create_event, ' ')+1));

5 个答案:

答案 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

Demo on 3v4l.org

答案 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);

https://3v4l.org/K4qE7

答案 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 +“数组解构”将值分配给变量。

该模式显示,每次遇到时都会拆分:

  1. 空格,连字符,空格或
  2. 使用空格(后跟2小时数字,后接一个冒号)。(?=...)超前使用是为了使时间子字符串不会在过程中作为定界子字符串的一部分被“消耗”。