2011-12-16 95 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'); 

因为在不同的国家星期一或星期一的第一天可能是星期一或星期天

相关问题