Разделите длинную цепочку дат и времен - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующая строка в PHP:

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

Я бы хотел разделить его на 4 части, а затем получить доступ к ним как к переменным:

  • дата начала (12 января 2019 г.)
  • время начала (8:00 вечера)
  • дата окончания (14 февраля 2019 г.)
  • время окончания (06:00)

Я хотел бы сделать это динамичным. Могу ли я что-нибудь сделать с помощью кода, чтобы отделить это автоматически?

Edit:

Вот что я пытался извлечь дату начала:

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

Ответы [ 5 ]

0 голосов
/ 01 февраля 2019

Если вы просто хотите разделить строку на четыре части, то вы можете сделать это за один вызов preg_, чтобы взорвать два разделителя.

Код: ( Демо )

$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-х часовыми цифрами, а затем двоеточием). Предварительный просмотр (?=...) используется для того, чтобы временная подстрока не «использовалась» как часть подстроки разграничения в процессе.
0 голосов
/ 13 января 2019

Вы можете создать объект 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

Демонстрация на 3v4l.org

0 голосов
/ 13 января 2019

Мы можем попробовать использовать комбинацию регулярных выражений split и match:

$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
0 голосов
/ 13 января 2019

Метод, которому не нужны все тяжелые регулярные выражения, заключается в использовании разнесения двумя различными способами.

Сначала мы взрываем другой DateTime на «-», затем мы зацикливаемся и взрываемся в пространстве.
Мы знаем, что дата имеет три пробела, так как есть год, месяц и день.
Скопируйте три элемента в качестве даты, используя 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

0 голосов
/ 13 января 2019

Попробуйте 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)
  }
}
...