2010-08-19 74 views
15

我有一個從MySQL數據庫中提取信息兩個部分,在(2009年,2010年,ECT)和(1-52)。我需要它轉換爲日期開始和結束日期..年和本週至今在PHP

例如:

Year=2010, Week=1 would be (Friday, Jan 1st, 2010) - (Sunday, Jan 3rd, 2010) 
Year=2010, Week=33 would be (Monday, Aug 16th, 2010) - (Sunday, Aug 22nd, 2010) 
Year=2010, Week=34 would be (Monday, Aug 23rd, 2010) - (Sunday, Aug 29th, 2010) 

我怎麼會去這樣做,在PHP?

回答

29
$year = "2010"; // Year 2010 
$week = "01"; // Week 1 

$date1 = date("l, M jS, Y", strtotime($year."W".$week."1")); // First day of week 
$date2 = date("l, M jS, Y", strtotime($year."W".$week."7")); // Last day of week 
echo $date1 . " - " . $date2; 

如果週數小於10,則在數字前加上0。 1將無法正常工作,應該是01

+3

如果你使用'的sprintf( 「%02u」,$ week)''而不是'$ week',如果週數小於10,則周編號將總是前綴0。 – 2013-12-16 12:46:57

+0

Mysql Week從零開始 – 2015-05-30 21:07:21

0

嘗試了這一點:

$year = 2000; 
$week = 1; 
$start = date("l, M jS, Y", strtotime("01 Jan ".$year." 00:00:00 GMT + ".$week." weeks")); 
$end = date("l, M jS, Y", strtotime($start." + 1 week")); 
echo $start." to ".$end; 

你需要$一年$周來設置。然後它將按照指定打印間隔。

例如,按原樣輸出爲:

Friday, Jan 7th, 2000 to Friday, Jan 14th, 2000 

注意周從0-51索引(容易修復)。

這是一種醜陋的,但它的作品。希望有所幫助!

2
function getStartAndEndDate($week, $year) 
{ 
    //setting the default time zone 
    date_default_timezone_set('America/New_York'); 

    //getting the 
    //$firstWeek = date('W',strtotime("January 1 $year", date(time()))); 
    //echo "Year : ".$year."<br/>"."Week : ".$week."<br/>"; 
    $firstWeekThursDay = date('W',strtotime("January $year first thursday",date(time()))); 

    if($firstWeekThursDay == "01") 
    { 
     $time  = strtotime("January $year first thursday",date(time())); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $time  = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $return[0] = date('Y-m-d', $time); 
     $time += 6*24*3600; 
     $return[1] = date('Y-m-d', $time); 
     //print_r($return); 
    } 
    else 
    { 
     $time = strtotime("January 1 $year", time()); 
     //echo "<br/>".$time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $time  = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $return[0] = date('Y-m-d', $time); 
     $time  += 6*24*3600; 
     $return[1] = date('Y-m-d', $time); 
     //print_r($return); 
     //echo "<br/>End of Hi<br/>"; 

    } 
    return $return; 
} 
+0

優秀!這項工作對我來說,謝謝:) – 2017-12-28 23:32:05

9

因爲這個問題和接受的答案被張貼在DateTime類使這更簡單的事: -

function daysInWeek($weekNum) 
{ 
    $result = array(); 
    $datetime = new DateTime(); 
    $datetime->setISODate((int)$datetime->format('o'), $weekNum, 1); 
    $interval = new DateInterval('P1D'); 
    $week = new DatePeriod($datetime, $interval, 6); 

    foreach($week as $day){ 
     $result[] = $day->format('d/m/Y'); 
    } 
    return $result; 
} 

var_dump(daysInWeek(24)); 

輸出: -

array (size=7) 
    0 => string '10/06/2013' (length=10) 
    1 => string '11/06/2013' (length=10) 
    2 => string '12/06/2013' (length=10) 
    3 => string '13/06/2013' (length=10) 
    4 => string '14/06/2013' (length=10) 
    5 => string '15/06/2013' (length=10) 
    6 => string '16/06/2013' (length=10) 

這有照顧閏年等額外的好處..

+1

這是目前可用的最佳答案。 – 2016-07-11 16:39:27

+0

這個答案在閏年時無法正常工作 – undefinedman 2017-01-01 23:37:32

+0

@undefinedman現在應該,謝謝你的支持。 – vascowhite 2017-01-02 14:20:11