如何将分钟合并到时间段
How to combine minutes to a timeblock
在后台运行一个脚本来检查某人是否有空。该脚本然后在数据库中插入一个值。我无法控制这个脚本。输出如下:
12:01:00
12:02:00
12:03:00
12:10:00
12:11:00
12:12:00
12:13:00
12:14:00
12:15:00
等等
现在我需要使用 PHP 对这些数据进行分组,这样我将得到连续行的第一个和最后一个数据。所以在这种情况下,我需要的数据是:
12:01:00
12:03:00
12:10:00
12:15:00
我已经搜索过这个论坛和谷歌,但也许我的英语不够好,找不到答案。我尝试了各种想法(比如将时间与之前的时间进行比较,但每次我都遇到意外或无效的结果)。
- 读取时间字符串并将其设置为时间段的开始和结束。
- 读取下一个时间字符串。
- 计算时间串的差值,如果小于00:01:00则延长时间段。如果超过 1 分钟,则打印时间段并开始新的时间段。转到 2.
当你使用mtkime()和date()时,你应该调用
date_default_timezone_set('UTC');
以下是代码示例。数据以字符串形式存储在数组中。
date_default_timezone_set('UTC');
$arr = array(
'12:01:00',
'12:02:00',
'12:03:00',
'12:10:00',
'12:11:00',
'12:12:00',
'12:13:00',
'12:14:00',
'12:15:00'
);
// Start of code sample
$firsttime = true;
$start_time = '';
$end_time = '';
foreach ($arr as $time) {
if ($firsttime === true) { // start of a new time range
// above test can be changed to $start_time === '' && $end_time === ''
$firsttime = false;
$start_time = $time;
$end_time = $time;
} else {
$diff = diff_time($end_time, $time);
// insert error check here
if ($diff <= '00:01:00') { // consecutive
$end_time = $time; // update end of the time range
} else { // end of the time range
echo $start_time, '<br />';
echo $end_time, '<br />';
$start_time = $time;
$end_time = $time;
}
}
}
if ($start_time !== '' && $end_time !== '') {
echo $start_time, '<br />';
echo $end_time, '<br />';
}
echo 'End<hr />';
function diff_time($from_time, $to_time) {
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $from_time, $captured)) {
$from = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $to_time, $captured)) {
$to = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if ($from > $to) {
return date('-H:i:s', $from - $to);
} else {
return date('H:i:s', $to - $from);
}
在后台运行一个脚本来检查某人是否有空。该脚本然后在数据库中插入一个值。我无法控制这个脚本。输出如下:
12:01:00
12:02:00
12:03:00
12:10:00
12:11:00
12:12:00
12:13:00
12:14:00
12:15:00
等等
现在我需要使用 PHP 对这些数据进行分组,这样我将得到连续行的第一个和最后一个数据。所以在这种情况下,我需要的数据是:
12:01:00
12:03:00
12:10:00
12:15:00
我已经搜索过这个论坛和谷歌,但也许我的英语不够好,找不到答案。我尝试了各种想法(比如将时间与之前的时间进行比较,但每次我都遇到意外或无效的结果)。
- 读取时间字符串并将其设置为时间段的开始和结束。
- 读取下一个时间字符串。
- 计算时间串的差值,如果小于00:01:00则延长时间段。如果超过 1 分钟,则打印时间段并开始新的时间段。转到 2.
当你使用mtkime()和date()时,你应该调用
date_default_timezone_set('UTC');
以下是代码示例。数据以字符串形式存储在数组中。
date_default_timezone_set('UTC');
$arr = array(
'12:01:00',
'12:02:00',
'12:03:00',
'12:10:00',
'12:11:00',
'12:12:00',
'12:13:00',
'12:14:00',
'12:15:00'
);
// Start of code sample
$firsttime = true;
$start_time = '';
$end_time = '';
foreach ($arr as $time) {
if ($firsttime === true) { // start of a new time range
// above test can be changed to $start_time === '' && $end_time === ''
$firsttime = false;
$start_time = $time;
$end_time = $time;
} else {
$diff = diff_time($end_time, $time);
// insert error check here
if ($diff <= '00:01:00') { // consecutive
$end_time = $time; // update end of the time range
} else { // end of the time range
echo $start_time, '<br />';
echo $end_time, '<br />';
$start_time = $time;
$end_time = $time;
}
}
}
if ($start_time !== '' && $end_time !== '') {
echo $start_time, '<br />';
echo $end_time, '<br />';
}
echo 'End<hr />';
function diff_time($from_time, $to_time) {
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $from_time, $captured)) {
$from = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $to_time, $captured)) {
$to = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if ($from > $to) {
return date('-H:i:s', $from - $to);
} else {
return date('H:i:s', $to - $from);
}