分割字符串以拖曳Datetime对象

时间:2019-11-07 10:08:19

标签: php regex

我有这种字符串09:00-18:00,我想得到2 \ DateTime。右边部分的时间返回一个对象,左边部分的时间返回另一个对象。 我尝试使用split,但是我的解决方案看起来并不理想,这就是为什么我要其他解决方案的原因。 这是我的解决方案:

    // 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 个答案:

答案 0 :(得分:1)

如果您确定自己的输入将始终具有相同的结构,则可以使用以下内容:

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

您的变量$ start将包含'09h00',而$ end将包含'18h00'

答案 1 :(得分:1)

您需要使用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);

您可以在线查看Demo

答案 2 :(得分:1)

date_create和新的DateTime可以识别hh:mm和hh:mm:ss,即使没有格式规范也是如此。该日期设置为当前日期。

$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个datetime对象的数组:

$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
}