获取给定日期的一周内所有工作日

Ric*_*nop 3 php datetime

所以我有一个日期作为字符串:

2011/06/01
Run Code Online (Sandbox Code Playgroud)

我需要从中获取与该周的五个工作日(星期一到星期五)相对应的5个DateTime对象,例如,我需要2011-05-30到2011-06-03.

怎么做?我知道我能做到:

$dateTime = new DateTime('2011/06/01');
Run Code Online (Sandbox Code Playgroud)

但我有点卡在那里:)我知道,令人尴尬.

Gor*_*don 7

可以使用DatePeriod:

$firstMondayThisWeek= new DateTime('2011/06/01');
$firstMondayThisWeek->modify('tomorrow');
$firstMondayThisWeek->modify('last Monday');

$nextFiveWeekDays = new DatePeriod(
    $firstMondayThisWeek,
    DateInterval::createFromDateString('+1 weekdays'),
    4
);

print_r(iterator_to_array($nextFiveWeekDays));
Run Code Online (Sandbox Code Playgroud)

请注意,这DatePeriod是一个Iterator,所以除非你真的修复了数组中的日期,你也可以使用DatePeriodas容器.

以上将给出类似的东西(演示)

 Array
(
[0] => DateTime Object
    (
        [date] => 2011-05-30 00:00:00
        [timezone_type] => 3
        [timezone] => Europe/Berlin
    )

[1] => DateTime Object
    (
        [date] => 2011-05-31 00:00:00
        [timezone_type] => 3
        [timezone] => Europe/Berlin
    )

[2] => DateTime Object
    (
        [date] => 2011-06-01 00:00:00
        [timezone_type] => 3
        [timezone] => Europe/Berlin
    )

[3] => DateTime Object
    (
        [date] => 2011-06-02 00:00:00
        [timezone_type] => 3
        [timezone] => Europe/Berlin
    )

[4] => DateTime Object
    (
        [date] => 2011-06-03 00:00:00
        [timezone_type] => 3
        [timezone] => Europe/Berlin
    )
)
Run Code Online (Sandbox Code Playgroud)

一个5.3之前的解决方案就是这样做

$firstMondayInWeek = strtotime('last Monday', strtotime('2011/06/01 +1 day'));
$nextFiveWeekDays = array();
for ($days = 1; $days <= 5; $days++) {
    $nextFiveWeekDays[] = new DateTime(
        date('Y-m-d', strtotime("+$days weekdays", $firstMondayInWeek))
    );
}
Run Code Online (Sandbox Code Playgroud)

虽然我真的不明白为什么当你不能/不能在你的项目中使用他们的API时你想要使用DateTime对象.如您所见,这是所有旧日期函数,DateTime只是容器.