2011-12-16 128 views
13

是否可以使用PHP的Relative Date Time format獲取一週的第一個/最後一個日期?獲取本週的第一個/最後一個日期

我試圖做的事:

date_default_timezone_set('Europe/Amsterdam'); 
$date = new DateTime(); 

$date->modify('first day of this week'); // to get the current week's first date 
echo $date->format('Y-m-d'); // outputs 2011-12-19 

$date->modify('first day of week 50'); // to get the first date of any week by weeknumber 
echo $date->format('Y-m-d'); // outputs 2011-12-18 

$date->modify('last day of this week'); // to get the current week's last date 
echo $date->format('Y-m-d'); // outputs 2011-12-17 

$date->modify('last day of week 50'); // to get the last date of any week by weeknumber 
echo $date->format('Y-m-d'); // outputs 2011-12-18 

正如你可以see它不輸出正確的日期。

根據the docs這應該是可能的,如果我是正確的。

我是否在做可怕的錯誤?

編輯

我需要使用PHP的日期時間在遙遠的未來日期。

UPDATE

現在只得到陌生人。我已經做了更多的測試。

的Windows PHP 5.3.3

2011-12-01 

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (first day of week 50) at position 13 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 9 
2011-12-01 
2011-11-30 

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (last day of week 50) at position 12 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 15 
2011-11-30 

的Linux 5.3.8

2011-12-01 
2011-12-01 
2011-11-30 
2011-11-30 
+1

如果星期日或星期一是星期幾的第一天,這種喜歡取決於語言環境嗎? – mario 2011-12-16 23:41:58

+0

@mario:我不知道你告訴我。無論哪種方式,前兩個應該輸出相同的東西。最後兩名恕我直言,同樣如此。無論是星期天/星期一開始 – PeeHaa 2011-12-16 23:43:36

回答

21

根據文檔的格式字符串 「第一天」 和 「最後一天」 只允許數月,不是幾個星期。請參閱http://www.php.net/manual/en/datetime.formats.relative.php

如果您將第一天和最後一天與周聲明組合在一起,結果可能會引發解析器或您不期望的事情(通常是一個月的第一天或最後一天,而不是一週)。

Win和Linux之間的區別可能僅僅是因爲不同的錯誤報告設置。

爲了得到當前一週使用的第一天和最後一天:

$date->modify('this week'); 
$date->modify('this week +6 days'); 

爲了得到第50周使用的第一天和最後一天:

$date->setISODate(2011, 50); 
$date->setISODate(2011, 50, 7); 

編輯:

如果您想要使用絕對星期編號的修改方法,則必須使用http://www.php.net/manual/en/datetime.formats.compound.php中定義的格式:

$date->modify('2011W50'); 
$date->modify('2011W50 +6 days'); 
+0

您可能對此有所瞭解。雖然我沒有看到它的狀態,但它只能使用數月(可能只是我需要睡覺:))。 BTW錯誤報告在兩臺機器上都是一樣的。那麼你說什麼,它只有可能得到當前的第一個/最後一個日期(可能還有下一個,上一個等)星期而不是星期數? (我知道我可以自己計算,只是認爲這會更整潔) – PeeHaa 2011-12-17 00:52:18

0
function getweek_first_last_date($date) 
{ 
    $cur_date = strtotime($date); // Change to whatever date you need 
    // Get the day of the week: Sunday = 0 to Saturday = 6 
    $dotw = date('w', $cur_date); 
    if($dotw>1) 
    { 
     $pre_monday = $cur_date-(($dotw-1)*24*60*60); 
     $next_sunday = $cur_date+((7-$dotw)*24*60*60); 
    } 
    else if($dotw==1) 
    { 
     $pre_monday = $cur_date; 
     $next_sunday = $cur_date+((7-$dotw)*24*60*60); 
    } 
    else if($dotw==0) 
    { 
     $pre_monday =$cur_date -(6*24*60*60);; 
     $next_sunday = $cur_date; 
    } 

    $date_array = array(); 
    $date_array['start_date_of_week'] = $pre_monday; 
    $date_array['end_date_of_week'] = $next_sunday; 

    return $date_array; 
} 

$date = '2013-12-22'; 
getweek_first_last_date($date); 


Output : 
$array_of_week = Array 
(
    [start_date_of_week] => 1387152000 
    [end_date_of_week] => 1387670400 
) 

$start_date =date('d/m/Y', $array_of_week['start_date_of_week']) 
2

這是我使用從任何日期獲得一週的第一天和最後一天的東西。 在這種情況下,星期一是一週的第一天...

$date = date('Y-m-d'); // you can put any date you want 
$nbDay = date('N', strtotime($date)); 
$monday = new DateTime($date); 
$sunday = new DateTime($date); 
$monday->modify('-'.($nbDay-1).' days'); 
$sunday->modify('+'.(7-$nbDay).' days'); 
0
<code> 
function getlastweek_first_last_date() 
{ 
    $cur_date = strtotime(date('Y-m-d')); // Change to whatever date you need 
    // Get the day of the week: Sunday = 0 to Saturday = 6 
    $previousweekcurdate = $cur_date - (7*24*3600); 
    $cur_date = $previousweekcurdate; 
    $dotw = date('w', $cur_date); 
    if($dotw>1) 
    { 
     $pre_sunday = $cur_date-(($dotw-1)*24*60*60) - (24*60*60); 
     $next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60); 
    } 
    else if($dotw==1) 
    { 
     $pre_sunday = $cur_date- (24*60*60); 
     $next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60); 
    } 
    else if($dotw==0) 
    { 
     $pre_sunday =$cur_date -(6*24*60*60)- (24*60*60); 
     $next_satday = $cur_date- (24*60*60); 
    } 

    $pre_sunday = date('Y-m-d',$pre_sunday)." 00:00:00"; 
    $next_satday = date('Y-m-d',$next_satday)." 23:59:59"; 
    $date_array = array(); 
    $date_array['sdoflw'] = $pre_sunday; 
    $date_array['edoflw'] = $next_satday; 

    return $date_array; 
} 

$date_array = getlastweek_first_last_date(); 
echo $start_date_of_week = $date_array['sdoflw']; 
echo $end_date_of_week = $date_array['edoflw']; 

</code> 
29

我使用Carbon庫,這使得這樣的事情很容易的忠實粉絲。例如:

use Carbon\Carbon; 

$monday = Carbon::now()->startOfWeek() 
$sunday = Carbon::now()->endOfWeek() 

或者,如果你更喜歡有星期日是你一週的第一天:

use Carbon\Carbon; 

Carbon::setWeekStartsAt(Carbon::SUNDAY); 
Carbon::setWeekEndsAt(Carbon::SATURDAY); 

$sunday = Carbon::now()->startOfWeek() 
$saturday = Carbon::now()->endOfWeek() 
2

如果一週的第一天是星期一

$date->modify('Monday this week'); 

其他如果第一天是星期天

$date->modify('Sunday this week'); 

因爲在不同的國家星期一或星期一的第一天可能是星期一或星期天

相關問題