这是json格式的列表时间:
$datatest = '{
"dt": [
"2018-06-10T00:16:02.200Z",
"2018-06-11T03:35:10.629Z",
"2018-06-11T04:20:58.629Z",
"2018-06-11T05:00:05.171Z",
"2018-06-11T05:49:05.171Z",
"2018-06-11T06:53:55.629Z",
"2018-06-11T06:57:13.708Z"
]
}';
我想要的只是按 2 小时间隔分配或分配时间。这是我的 PHP 代码:
$data = json_decode($datatest, false);
echo "<table border=\"1\">";
foreach($data->{'dt'} as $time){
echo "<tr>";
echo "<td>".$time;
$time_in_sec = strtotime($time);
echo "==>".$time_in_sec."</td>";
$timeslot = setTimeSlot($time_in_sec);
echo "<td>Rounded down: " . date('Y-m-d\TH:i:s\Z', $timeslot)."</td>";
echo "</tr>";
}
echo "</table>";
function setTimeSlot($timeinseconds){
$seconds = $timeinseconds;
$rounded_seconds = floor($seconds / (2 * 60 * 60)) * (2 * 60 * 60);
return $rounded_seconds;
}
下面是结果。我不想要这个输出:
2018-06-10T00:16:02.200Z==>1528589762 Rounded down: 2018-06-10T00:00:00Z 2018-06-11T03:35:10.629Z==>1528688110 Rounded down: 2018-06-11T02:00:00Z 2018-06-11T04:20:58.629Z==>1528690858 Rounded down: 2018-06-11T04:00:00Z 2018-06-11T05:00:05.171Z==>1528693205 Rounded down: 2018-06-11T04:00:00Z 2018-06-11T05:49:05.171Z==>1528696145 Rounded down: 2018-06-11T04:00:00Z 2018-06-11T06:53:55.629Z==>1528700035 Rounded down: 2018-06-11T06:00:00Z 2018-06-11T06:57:13.708Z==>1528700233 Rounded down: 2018-06-11T06:00:00Z
我想修改上面的代码以添加偏移量 1 小时。我需要将它舍入到 2 小时间隔,这样输出就会像这样而不是从 0 小时开始。我不知道如何计算偏移量。
回合时间应该是:07, 09, 11, 13, 15, 17, 19, 21, 23, 01, ... 不应该:08, 10, 12, 14, 16, 18, ...
我终于解决了这个问题。抱歉,添麻烦了。这是代码。 :
function setTimeSlot($timeinseconds){
$offset = 3600;//1 hours offset
$seconds = $timeinseconds;
$rounded_seconds = floor(($seconds - $offset) / (2 * 60 * 60)) * (2 * 60 * 60);
return ($rounded_seconds + $offset);
}
最佳答案
我认为这对您有用。这将向下舍入到 24 小时格式中最接近的奇数小时。
请注意,我关闭了 html 元素,我只是在命令行上的单个 php 脚本中运行它。此外,我还添加了几个日期字符串用于测试。
<?php
$datatest = '{
"dt": [
"2018-06-10T00:16:02.200Z",
"2018-06-11T03:35:10.629Z",
"2018-06-11T04:20:58.629Z",
"2018-06-11T05:00:05.171Z",
"2018-06-11T05:49:05.171Z",
"2018-06-11T06:53:55.629Z",
"2018-06-11T06:57:13.708Z",
"2018-06-11T11:57:13.708Z",
"2018-06-11T15:57:13.708Z",
"2018-06-11T18:57:13.708Z",
"2018-06-11T23:57:13.708Z"
]
}';
$data = json_decode($datatest, false);
foreach($data->{'dt'} as $time){
echo $time;
$time_in_sec = strtotime($time);
// uncomment the following to see the rounding
//$hour = date('H', $time_in_sec);
//$roundedHour = roundHour($hour);
//echo " " . $hour . " " . $roundedHour;
echo " " . formatDate(getRoundedTime($time_in_sec)). " ";
echo "\n";
}
function formatDate($time) {
return date('Y-m-d\TH:i:s\Z', $time);
}
function getRoundedTime($time) {
$day = date('d', $time);
$month = date('m', $time);
$year = date('Y', $time);
$hour = roundHour(date('H', $time));
return mktime($hour, 0, 0, $month, $day, $year);
}
//will round down to nearest odd hour, 01-23 hours
function roundHour(string $hour) {
$newHour = intval($hour);
$mod = $newHour % 2;
if ($mod === 0) {
$newHour = $newHour - 1;
$newHour = $newHour === -1 ? 23 : $newHour;
}
$roundedHour = (string) $newHour;
return str_pad($roundedHour, 2, "0", STR_PAD_LEFT);
}
这应该会产生这样的结果:
2018-06-10T00:16:02.200Z 2018-06-10T23:00:00Z
2018-06-11T03:35:10.629Z 2018-06-11T03:00:00Z
2018-06-11T04:20:58.629Z 2018-06-11T03:00:00Z
2018-06-11T05:00:05.171Z 2018-06-11T05:00:00Z
2018-06-11T05:49:05.171Z 2018-06-11T05:00:00Z
2018-06-11T06:53:55.629Z 2018-06-11T05:00:00Z
2018-06-11T06:57:13.708Z 2018-06-11T05:00:00Z
2018-06-11T11:57:13.708Z 2018-06-11T11:00:00Z
2018-06-11T15:57:13.708Z 2018-06-11T15:00:00Z
2018-06-11T18:57:13.708Z 2018-06-11T17:00:00Z
2018-06-11T23:57:13.708Z 2018-06-11T23:00:00Z
关于php - 将时间分配为 2 小时间隔,并带有偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949348/