获取一周的第一个/最后一个日期

时间:2011-12-16 23:40:10

标签: php datetime

是否可以使用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的DateTime作为日期。

更新

现在变得更加陌生。我做了一些测试。

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

6 个答案:

答案 0 :(得分:42)

我是使用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()

答案 1 :(得分:25)

根据文档,格式字符串“第一天”和“最后一天”仅允许数月,而不是数周。见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');

答案 2 :(得分:3)

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

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

否则,如果第一天是星期天

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

因为在不同国家/地区的第一天可能是周一或周日

答案 3 :(得分: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');

答案 4 :(得分: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'])

答案 5 :(得分: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>