Получить все рабочие дни в неделю на определенную дату - PullRequest
3 голосов
/ 01 июня 2011

Итак, у меня есть одна дата в виде строки:

2011/06/01

Мне нужно получить из него 5 объектов DateTime, которые соответствуют пяти рабочим дням (с понедельника по пятницу) на этой неделе , например. на вышеуказанную дату мне нужно с 2011-05-30 по 2011-06-03.

Как это сделать? Я знаю, что могу сделать:

$dateTime = new DateTime('2011/06/01');

Но я вроде как застрял там :) Знаю, смущает.

Ответы [ 4 ]

7 голосов
/ 01 июня 2011

Можно использовать 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));

Обратите внимание, что DatePeriod - это Iterator, поэтому, если вы действительно не хотите иметь даты в массиве, вы можететакже используйте DatePeriod в качестве контейнера.

Выше приведено что-то вроде ( demo )

 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
    )
)

Одно решение до 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))
    );
}

, хотя я действительно не понимаю, почему вы захотите использовать объекты DateTime для этого, когда вы не можете / не можете использовать их API в вашем проекте.Как видите, это все старые функции даты, а DateTime является просто контейнером.

1 голос
/ 01 июня 2011

Вы можете получить номер дня недели с датой ('w') от 0 (для воскресенья) до 6 (для субботы). Отсюда вы можете получить оставшиеся рабочие дни с помощью strtotime («+ 1 ДЕНЬ», [ваша временная метка]) и так далее. Когда у вас есть даты, вы можете сделать объекты.

1 голос
/ 01 июня 2011

Попробуйте:

$dayAfter = $dateTime->modify('+1 day');

чтобы получить один день вперед. Для получения дополнительной информации обратитесь к руководству по PHP для этого класса здесь.

0 голосов
/ 01 июня 2011

Это похоже на работу:

$d = date('N', strtotime('2011/06/01'));
// here N means ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0)
$week = array();
for($i = 1; $i < $d; ++$i){
    $dateTime = new DateTime('2011/06/01');
    for($j = 0; $j < $i; ++$j){
        $dateTime->modify('-1 day');
    }   
    $week[] = $dateTime;
}
$week[] = new DateTime('2011/06/01');
for($i = $d+1; $i <= 7; ++$i){
    $dateTime = new DateTime('2011/06/01');
    for($j = 0; $j < $i - $d; ++$j){
        $dateTime->modify('+1 day');
    }   
    $week[] = $dateTime;
}
sort($week);

foreach($week as $day){
    echo $day->format('Y-m-d H:i:s'), '<br />';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...