繁体   English   中英

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

[英]Get all Work Days in a Week for a given date

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

2011/06/01

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

怎么做? 我知道我可以做到:

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

但我有点卡在那里:) 我知道,很尴尬。

可以使用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作为容器的 go 。

以上将给出类似(演示)的内容

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

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

尝试:

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

提前一天。 有关更多信息,请在此处查看 class 上的 php 手册。

您可以使用 date('w') 0(星期日)到 6(星期六)来获取星期几。 从中您可以使用 strtotime("+1 DAY", [your timestamp]) 等获得工作日的 rest 等。 有了日期,您就可以制作对象了。

我已经这样做了整整一周。 我创建了一个 function ,它返回一周中所有天的列表。 我让你下面的代码

public function daysOfWeekXML($day)
{
    // Give number of day in the week
    $day_number = date('N', strtotime($day));

    $day_week_futur = [];
    $day_week_past = [];

    // Retrieve future days in the week
    for ($i = $day_number; $i <= 7; $i++) {
        $next_day = strtotime('+' . $i - $day_number . ' day', strtotime($day));
        array_push($day_week_futur, date('Y-m-d', $next_day));
    }

    // Retrieve days past in the week
    for ($day_number; $day_number > 1; $day_number--) {
        $previous_day = strtotime('-' . ($day_number - 1) . ' day', strtotime($day));
        array_push($day_week_past, date('Y-m-d', $previous_day));
    }
    // Concatenate all days in the week in array
    return array_merge($day_week_past, $day_week_futur);
}

这似乎有效:

$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 />';
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM