我有这种字符串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]);
任何帮助将不胜感激。
答案 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
}