日期函数确定给定日期和日期的最接近日期

Date function to determine closest date given the day and date

我需要一个能给我日期的函数,给定一个日期和一天。我的一周总是从周六开始,到周五结束。给定本周中的任何日期,我需要知道本周每一天的日期。

getdatefromday($date,$day);

例如:

$date = "2016/04/10";
$day = "Thu";
getdatefromday($date,$day);
//Result is 2016-04-14 

我已经使用下面的代码解决了这个问题,但我相信这可以用更少的代码解决,我就是想不通。

这是我对这个问题的解决方案:

function getdatefromday($date,$day) {
    $curr_day = date("D", strtotime($date));
    switch ($curr_day) {
    case 'Sat':
        switch ($day) {
            case 'Sat':
                return $date;
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '+2 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '+3 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '+4 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '+5 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+6 day' , strtotime ( $date) ) ));
                break;                      
            }
    case 'Sun':
            switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return $date;
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '+2 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '+3 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '+4 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+5 day' , strtotime ( $date) ) ));
                break;                      
            }
        break;
    case 'Mon':
        switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-2 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return $date;
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '+2 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '+3 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+4 day' , strtotime ( $date) ) ));
                break;                      
            }
    case 'Tue':
        switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-3 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '-2 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return $date;
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '+2 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+3 day' , strtotime ( $date) ) ));
                break;                      
            }       
    case 'Wed':
        switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-4 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '-3 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '-2 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return $date;
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+2 day' , strtotime ( $date) ) ));
                break;                      
            }
    case 'Thu':
        switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-5 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '-4 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '-3 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '-2 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return $date;
                break;
            case 'Fri':
                return date('Y-m-d',(strtotime ( '+1 day' , strtotime ( $date) ) ));
                break;                      
            }   
    case 'Fri':
        switch ($day) {
            case 'Sat':
                return date('Y-m-d',(strtotime ( '-6 day' , strtotime ( $date) ) ));
                break;
            case 'Sun':
                return date('Y-m-d',(strtotime ( '-5 day' , strtotime ( $date) ) ));
                break;              
            case 'Mon':
                return date('Y-m-d',(strtotime ( '-4 day' , strtotime ( $date) ) ));
                break;
            case 'Tue':
                return date('Y-m-d',(strtotime ( '-3 day' , strtotime ( $date) ) ));
                break;
            case 'Wed':
                return date('Y-m-d',(strtotime ( '-2 day' , strtotime ( $date) ) ));
                break;
            case 'Thu':
                return date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
                break;
            case 'Fri':
                return $date;
                break;                      
            }       
        }


}

有什么想法吗?

您可以试试下面提到的代码。在这里,它将打印从您输入的日期开始整周的所有 7 个日期。

$date = "2016-04-05";
$week = date("w",strtotime($date));
if ($week == 6) {
    $saturday   = $date;
} else {
    $saturday   = date("Y-m-d",strtotime($date." last Saturday"));
}

$friday = date("Y-m-d", strtotime($saturday." +6 days"));
$start  = strtotime($saturday);
$end     = strtotime($friday);
while ($start <= $end){
   echo date("Y-m-d", $start);
   echo "<br/>";
   $start += 86400;
}

我希望这有效:

$fromDate="2016/04/15";
$resultDay="Thursday";


$fromDateStamp=strtotime($fromDate);
$fromDateStampToSunday=date("w",strtotime($fromDate))*86400;

$sundayStamp=$fromDateStamp-$fromDateStampToSunday;//first get to sunday, and add the result day to the sunday timestamp

$resultDayStamp=date("w",strtotime($resultDay))*86400 + $sundayStamp;

echo date("Y/n/j",$resultDayStamp);

这是一种可能的解决方案:

<?php

echo getDateFromDay( "2016/04/11", "Tue" );

function getDateFromDay( $baseDate, $day )
{
    $timeStamp = strtotime( $baseDate );
    $offsetDay = date( "w", strtotime( $day ) ) - date( "w", $timeStamp );
    if ( $offsetDay < 0 ) {
        $offsetDay += 7;
    }
    return date( "Y-m-d", strtotime( "+{$offsetDay} day", $timeStamp ) );
}

?>

试试这个功能:

function getDateFromDay($date, $day) {
    $day = new DateTime($day);
    $day_w = $day->format('w');
    if ($day_w == 6) $day_w = -1;

    $date = new DateTime($date);
    $date_w = $date->format('w');
    if ($date_w == 6) $date_w = -1;

    $d = $day_w - $date_w;
    $date->modify("$d days");
    return $date->format('Y-m-d');
}

demo