简体   繁体   中英

Date function to determine closest date given the day and date

I need a function that gives me a date, given a date and a day. My week starts always on a Saturday and ends on a Friday. I need to know the date of each of the days of this week, given any date in this week.

getdatefromday($date,$day);

For example :

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

I have solved this problem already using the code bellow, but I am sure this can be solved in lot less lines, I just can't figure it out.

This is my solution to this problem :

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;                      
            }       
        }


}

Any ideas?

You can try the below mentioned code. Here, it will print all 7 dates of the entire week from your input date.

$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;
}

I hope this works:

$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);

Here is one possible solution:

<?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 ) );
}

?>

Try this function:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM