我在PHP中使用舍入时间时遇到了困难。
我想要的是生成一个基于当前日期的数字,但对应于最接近的" 3小时间隔"在将来。
很难解释,最好是举例:
当前日期时间(YYYYMMDDHHMM)= 201506021026
结果:时间戳为201506021200
或
当前日期和时间= 201506021825
结果:时间戳为201506022100
换句话说,我总是需要一个0AM,3AM,6AM,9AM,...... 21PM的最接近未来值的时间戳。
如果时间已经过了晚上9点,那么它将成为第二天凌晨0点的时间戳。
答案 0 :(得分:1)
$timestamp = time();
$threeHours = (3 * 60 * 60);
$timestamp += $threeHours;
$reminder = $timestamp % $threeHours;
$timestamp -= $reminder;
如果您想在过去找到最接近的“3小时间隔”,请不要将$threeHours
添加到$timestamp
;
我准备了一个考虑时区的代码段:http://3v4l.org/XOXMM
希望能解决你的问题。
答案 1 :(得分:0)
<?php
// find next hour accurate timestamp
$hour = date("G");
echo "hour: $hour <br />";
if ($hour <= 21) {
echo "still today...<br />";
for ($hour; $hour <= 24 ; $hour++) {
if ($hour %3 == 0) {
$close = strtotime("$hour:00:00");
echo "close hour: ".$close ."<br />";
// now from $close str time add 3 hours
for ($need =1; $need <= 12; $need++) {
$t += 3600*3;
echo date("y/m/d G:i:s" , $close + $t) . "<br />";
}
break;
}
}
} else {
echo "finding tomorrow...<br />";
}
$next = strtotime("6 hour");
echo date("y/m/d G:i:s" , $next);
echo "<br />";
echo date("y/m/d G:i:s");
结果:
hour: 19
still today...
close hour: 1433278800
15/06/03 0:00:00
15/06/03 3:00:00
15/06/03 6:00:00
15/06/03 9:00:00
15/06/03 12:00:00
15/06/03 15:00:00
15/06/03 18:00:00
15/06/03 21:00:00
15/06/04 0:00:00
15/06/04 3:00:00
15/06/04 6:00:00
15/06/04 9:00:00
15/06/03 1:52:15
15/06/02 19:52:15
答案 2 :(得分:0)
这可以通过 -
来完成
(1)使用createFromFormat()
将您的日期时间字符串转换为php DateTime
对象
(2)慢慢来。
(3)检查它是否超过21:00
(9:00pm
),如果是,请转到第二天并将时间设置为00:00
。
(4)如果未超过21:00
(9:00pm
),则将时间除以300
(3小时递增),使用ceil()
向上舍入到下一个整数,然后按3
(增加3小时)来获得下一个区块。
(5)重新格式化为你的日期时间字符串格式。
$date = DateTime::createFromFormat('YmdHi', '201506021026');
$time = $date->format('Hi');
if($time > 2100){
$date->add(new DateInterval('P1D'));
$date->setTime(00,00);
}
else{
$date->setTime(ceil($time/300)*3,00);
}
echo $date->format('YmdHi');
//Result: 201506021200
修改
从您对@AliTorabi的评论,如果您想获得20个间隔,可以通过添加循环添加3小时轻松完成
$date = DateTime::createFromFormat('YmdHi', '201506021026');
$time = $date->format('Hi');
if($time > 2100){
$date->add(new DateInterval('P1D'));
$date->setTime(00,00);
}
else{
$date->setTime(ceil($time/300)*3,00);
}
echo $date->format('YmdHi')."<br />"; // iteration 1
for($i=0;$i<19;$i++){ // iterations 2-20
$date->add(new DateInterval('PT3H'));
echo $date->format('YmdHi')."<br />";
}