Разделить строку для буксировки объектов Datetime - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть такая строка 09:00-18:00, я хочу получить 2 \ DateTime. Время правой части возвращает объект, а время левой части возвращает другой объект. Я пытался использовать сплит, но мое решение не кажется хорошим, поэтому я прошу другое решение. Это мое решение:

    // Get start time and end time separated by "-"
    $split = \preg_split('/[\s-]+/', $line['intervention_hour']);
    // Get hour number and minute separated by "h"
    $start = \preg_split('/[:]+/', $split[0]);
    $end = \preg_split('/[:]+/', $split[1]);

Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Вам необходимо использовать DateTime :: createFromFormat

$line = '09:00-18:00';

$split = explode('-', $line);

$start = DateTime::createFromFormat ( 'H:m', $split[0]);
$end = DateTime::createFromFormat ( 'H:m', $split[1]);

print_r($start);
echo '>>>';
print_r($end);

Вы можете проверить онлайн Демо

1 голос
/ 07 ноября 2019

date_create и новый DateTime распознают чч: мм и чч: мм: сс даже без спецификаций формата. Дата установлена ​​на текущую дату.

$line = '09:00-18:00';

$parts = explode('-', $line);

$start = date_create($parts[0]);
$end   = date_create($parts[1]);

var_dump($start, $end);

Вывод:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2019-11-07 09:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2019-11-07 18:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

Очень короткий вариант, который возвращает массив с 2 объектами даты и времени:

$line = '09:00-18:00';

$array = array_map('date_create',explode('-', $line));

Обновление:

Строгая проверка формата может быть реализована с помощью регулярных выражений.

if(preg_match('/^([01][0-9]|2[0-3]):[0-5][0-9]-([01][0-9]|2[0-3]):[0-5][0-9]$/',$line)){
  //processing

}
else {
  //format error
}
1 голос
/ 07 ноября 2019

Если вы уверены, что ваш ввод всегда будет иметь одинаковую структуру, вы можете использовать что-то вроде этого:

list($start, $end) = explode('-', str_replace(':','h','09:00-18:00'));

Ваша переменная $ start будет содержать '09h00', а $ end будет содержать '18h00«

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...