【问题标题】:How can i manage a date' sequence in php for showing how many days remaining to the next date?如何在 php 中管理日期序列以显示到下一个日期还剩多少天?
【发布时间】:2014-07-19 18:40:07
【问题描述】:

我有一个像 07/18/2014 这样的开始日期,一个像 07/24/2014 这样的结束日期,以及一个周期日期:每 2 天。 因此,从 07/18 开始,每 2 天我都会警告用户必须做一些事情,如果不是正确的一天,我会警告用户距离下一个警告还剩多少天。 我能怎么做?如果还添加时间和每 2 小时的时间段?

我考虑过首先将所有日期警告存储在一个数组中 [07-18/2014, 07-20-2014, 07-22-2014, 07/24/2014]

我的代码如下,但它不起作用。也许它不正确,就像我使用 strtotime 一样

$endg = strtotime ( "+". $dataupto . " days", strtotime ( $row['startdate'] ) ) ;     
$endg = date ( 'Y/m/d' , $endg ); 
$endgSTR = strtotime($endg);
$tempg = strtotime($row['startdate']); 

while( $tempg < $endgSTR){ 

        $arraymonitor[] = strtotime(  date($tempgdate )    );

        $tempg = $tempg + (strtotime ( " +1 days", $tempg  ) ); 


        $arraymonitor[] = $tempg; 
        echo "</br> tempg in while:";
        echo $tempg .  " ";

        echo "</br> tempg in while 2:";
        echo  date ( 'Y/m/d' , $tempg ) .  "<br/>";                     


    }

我也接受其他建议!

更新解决方案

                header( "content-type: text-plain" );
                function dayDiff($start, $end){
                    $timeleft = $end - $start;
                    $daysleft = round((($timeleft/24)/60)/60);
                    return $daysleft;
                }

                function testWarning($today, $end, $delay){
                    $endDate     = strtotime($end);
                    $warningDate = $endDate; 
                    $todayDate   = strtotime($today);

                    if( $todayDate == $warningDate ){
                        echo "Oggi c'è un controllo da fare";
                    }elseif( $todayDate < $warningDate ){
                        echo "Miss " . dayDiff($todayDate, $warningDate) . " days";
                    }else{
                        echo "warning was " . abs(dayDiff($todayDate, $warningDate)) . " giorni fa";
                    }

                    echo"\n";
                }

                $ardata =  [07/18/2014, 07/20/2014, 07/22/2014, 07/24/2014];
                $today3 = "07/21/2014"; // the day after warning
                testWarning( $today3, $end, $delay );

                $diffmin = 1000;                                        
                for ($i = 0 ; $i<= count($ardata)-1; $i++){

                    //print_r($ardata);
                    echo "</br> </br> ardata ";
                    echo $ardata[$i];
                    $dataseq = date ( 'm/d/Y' , strtotime($ardata[$i]) );       
                    $diffdata = dayDiff( strtotime($today3), strtotime($dataseq) );
                    echo "</br></br> DIFFDATA: ";
                    echo $diffdata;
                    echo " DIFFMIN ";
                    echo $diffmin;
                    if ($diffdata > 0){  // avoiding days before today
                        if ($diffdata < $diffmin){  
                            $diffmin = $diffdata;
                            $nextdata = $ardata[$i];  
                        }else{
                            if ($diffdata == -1){   
                                echo "error array empty";
                                $nextdata = $today3;
                            }
                        }
                    }else{
                        echo "monitorterminato";
                        $nextdata = -1;
                    }
                }   

                if  ($nextdata != -1){  

                    if ($diffmin == 0){    // giorno di oggi quindi avviso
                        echo "warning    WARNING </br> </br>";
                    }else if ($diffmin > 0 ){

                        echo " oggi ". $today3."  prossimo:". $nextdata. " </br></br>";
                        testWarning( $today3, $nextdata, $delay );   
                    }else{
                        // caso errato
                        echo " </br> </br> ERRORE nel calcolo non può essere negativo";
                    }                       
                }

【问题讨论】:

    标签: php date datetime strtotime


    【解决方案1】:

    这是一个示例,说明如何计算警告日期和警告前剩余天数。

    <?php
    header( "content-type: text-plain" );
    
    $end   = "09/18/2014";
    $delay = "- 2 days"; // warning will be on 16th
    
    $warningDay = date('m-d-Y', strtotime($delay, strtotime($end)));
    echo "Warning is on " . $warningDay . "\n";
    
    $today1 = "09/13/2014"; // 3 days before warning
    testWarning( $today1, $end, $delay );
    
    $today2 = "09/16/2014"; // warning day
    testWarning( $today2, $end, $delay );
    
    $today3 = "09/17/2014"; // the day after warning
    testWarning( $today3, $end, $delay );
    
    
    function testWarning($today, $end, $delay){
        $endDate     = strtotime($end);
        $warningDate = strtotime($delay, $endDate);
        $todayDate   = strtotime($today);
    
        echo "today : " . date('m-d-Y', $todayDate) . "->";
    
        if( $todayDate == $warningDate ){
            echo "Warning is today";
        }elseif( $todayDate < $warningDate ){
            echo "Warning in " . dayDiff($todayDate, $warningDate) . " days";
        }else{
            echo "Warning was " . abs(dayDiff($todayDate, $warningDate)) . " days ago";
        }
    
        echo"\n";
    }
    
    // $start and $end are timestamps
    function dayDiff($start, $end){
        $timeleft = $end - $start;
        $daysleft = round((($timeleft/24)/60)/60);
        return $daysleft;
    }
    

    【讨论】:

    • 对不起,我没有很好地解释。当第一个日期结束时,在您的示例中:2014 年 9 月 16 日,今天 3 不必显示:“警告是...”。在今天 3 中,可能会在第二天发出警告,根据时间段:2 天是 09/18/2014 等:今天 3:“今天警告 1 天”。我必须为存储在数组中的所有日期显示此警告:[07-18/2014, 07-20-2014, 07-22-2014, 07/24/2014]
    • 好的,我对你的代码做了一点工作,我达到了我的目标。我删除了延迟变量,因为它没有用,我用你的函数管理数组序列,我更新了解决方案!谢谢!
    【解决方案2】:

    如here所见

    $future = strtotime('21 July 2012'); //Future date.
    $timefromdb = //source time
    $timeleft = $future-$timefromdb;
    $daysleft = round((($timeleft/24)/60)/60); 
    echo $daysleft;
    

    【讨论】:

    • 这确实是一个很好的解决方案,但我怎么知道下一个日期是 7 月 21 日?在我的示例中,首先,我必须生成 4 个不同的“警告”日期并将它们存储在某处;那我怎么知道我必须选择做你建议我的未来日期?
    猜你喜欢
    • 2014-05-29
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2012-08-13
    • 2020-02-11
    相关资源
    最近更新 更多