在PHP中查找两个Unix时间戳之间的天数

31

嗨,我有一个保存事件的数据库。有两个字段“开始”和“结束”,这些字段包含时间戳。当管理员输入这些日期时,他们只能设置天、月、年。因此,我们只处理包含天、月、年的时间戳,而不是小时、分钟、秒钟(小时、分钟和秒钟都设置为0,0,0)。

我有一个以1262304000作为开始时间,1262908800作为结束时间的事件。它们转换为2010年1月1日和2010年1月8日。如何获取这些时间戳之间的所有日期?我想能够返回2010年1月2日(1262390400),2010年1月3日(1262476800)...一直到结束时间。这些事件可能跨越不同的月份,比如从5月28日到6月14日。

有什么想法吗?


可能是重复的问题:如何找到指定两个日期之间的日期 - Gordon
5
日期跨越夏令时更改时,所有按86400进行调整的解决方案都将失败。 - Mark Baker
马克·贝克:这就是Unix时间戳的问题所在。使用DateTime类可能更合适,尽管我没有检查过我们是否可以轻松地这样做。 - Vincent Savard
1
@Vincent - 在Gordon的链接中有一个示例代码块,使用datePeriod/dateInterval/dateTime完全可以实现这一点。 - Mark Baker
8个回答

52

您只需计算两个日期之间的秒数,然后除以86400(一天的秒数)即可得到天数:

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24;

然后,您可以使用for循环来检索日期:

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24;

for ($i = 1; $i < $numDays; $i++) {
    echo date('Y m d', strtotime("+{$i} day", $smallestTimestamp)) . '<br />';
}

如果你不知道哪个时间戳是最小的,你可以使用min()函数(strtotime中的第二个参数)。


1
是的,在整个东西上使用abs()函数。 - Vincent Savard
1
这将告诉您两个日期之间有多少天,但不包括日、月或年。 - Valentin Flachsel
一旦你知道哪个时间戳较小,哪个时间戳较大,abs 就变得多余了。相反,我会使用 if($small > $big) list($small,$big) = array($big,$small) 来交换它们。 - mpen
@VincentSavard 夏令时怎么办? - Shackrock
我发现这是我的解决方案:intval(($big - $small)/60/60/24) - Jonny White
显示剩余2条评论

3
我认为这个问题的一个快速解决方法是从end_stamp减去一天的秒数,直到达到start_tag。
//1 day = 86400 seconds

我会建立一个日期数组以备后用。
编辑(示例)
$difference = 86400;
$days = array();
while ( $start_time < $end_time )
{
    $days[] = date('M j Y', $end_time);

    $end_time -= $difference;
}

这应该覆盖任何时间范围,即使跨越几个月。

2

试试这个:

while($date_start <= $date_end) {
    echo date('M d Y', $date_start) . '<br>';
    $date_start = $date_start + 86400;
}

希望这能帮到你!

1
$daysInBetween = range($startTs, $endTs, 86400);
$secondDay = date('M d Y', $daysInBetween[1]);
/*
$thirdDay = date('M d Y', $daysInBetween[2]);
...
*/

请注意,range() 函数是包含在内的。

1
    **This is a very simple code for find days hours minutes and seconds in php**

    $dbDate = strtotime("".$yourbdDate.""); // Database date
    $endDate = time();    // current time
    $diff = $endDate - $dbDate; /// diffrence

    $days = floor($diff/86400);  ///  number of days 
    $hours = floor(($diff-$days*86400)/(60 * 60));  ////  number of hours
    $min = floor(($diff-($days*86400+$hours*3600))/60);///// numbers of minute


    $second = $diff - ($days*86400+$hours*3600+$min*60); //// secondes

    if($days > 0) echo $days." Days ago";
    elseif($hours > 0) echo $hours." Hours ago";
    elseif($min > 0) echo $min." Minute ago";
    else echo "Just second ago";

1
$d1=mktime(22,0,0,1,1,2007);
$d2=mktime(0,0,0,1,2,2007);
echo "Hours difference = ".floor(($d2-$d1)/3600) . "<br>";
echo "Minutes difference = ".floor(($d2-$d1)/60) . "<br>";
echo "Seconds difference = " .($d2-$d1). "<br>";


echo "Month difference = ".floor(($d2-$d1)/2628000) . "<br>";
echo "Days difference = ".floor(($d2-$d1)/86400) . "<br>";
echo "Year difference = ".floor(($d2-$d1)/31536000) . "<br>";

http://www.plus2net.com/php_tutorial/date-diff.php

http://www.phpf1.com/tutorial/php-date-difference.html


0

像这样吗?

$day = $start;
while ($day < $end) {
        $day += 86400;
        echo $day.' '.date('Y-m-d', $day).PHP_EOL;
}

顺便说一下,1262304000对应的是12月31日,而不是1月1日。


将返回天数减1。您需要使用 <= 运算符。 - Valentin Flachsel
他说“between”,所以我就假设它是排他的。 - netcoder

0

获取两个日期之间的差异并将其除以86400。abs(($date1 - $date2) / 86400) 将产生所需的结果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接