2016-04-10 27 views
1

我需要一个函数,给出日期,给定日期和日期。我的星期总是在星期六开始,星期五结束。鉴于本周的任何日期,我需要知道本周每天的日期。确定日期和日期的最近日期的日期函数

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


} 

任何想法?

回答

0

试试这个功能:

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

+0

Downvoter:为什么? –

+0

只是想补充一点,就是在星期六开始的那个星期六,我得到了星期六错误的结果。添加下面的代码在功能的开始使它正确:): if(date('D',strtotime($ date))=='Sat'){$ date = date('Y/m/d' ,(strtotime(' - 1 day',strtotime($ date)))); } –

+0

@IoannisKokkinis:你能给我一个例子,说明这段代码不起作用吗?在我的[demo](https://eval.in/602975)中,它是有效的,如果你在星期六,你会得到相同的星期六...... –

0

您可以尝试下面提到的代码。在这里,它将打印输入日期内整个星期的所有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; 
} 
0

我希望这个作品:

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

这不像OP所要求的那样工作。星期六应该始终是相同或以前,从来没有下一个... –

0

这里是一个可能的解决方案:

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

?> 
+0

这不工作像OP的需要。 'getDateFromDay('2016-04-11','Sat')'和'getDateFromDay('2016-04-11','Sun')'应该返回'2016-04-09'和'2016-04-10' 。 –