从此格式的日期开始:2011-05-01 09:00:00
,如何创建一个包含一年中所有工作日的所有办公时间(09:00至17:00)的数组(因此不包括所有星期六和周日)。我想要到达的是这样的:
2011-05-01 09:00:00
2011-05-01 10:00:00
2011-05-01 11:00:00
2011-05-01 12:00:00
2011-05-01 13:00:00
2011-05-01 14:00:00
2011-05-01 15:00:00
2011-05-01 16:00:00
2011-05-01 17:00:00
//next day, starting at 09:00 and ending at 17:00
2011-05-02 09:00:00
...
2011-05-02 17:00:00
//until the last day of the year from 09:00 to 17:00
2011-12-31 09:00:00
...
2011-12-31 17:00:00
开始日期将是当前月份的第一个月份,时间是09:00,最后一个日期(数组的最后一个元素)将始终是一年中最后一天的17:00。
同样,应排除周末。
伪代码理念:
我想到strtotime($start, "+1 one hour")
之类的内容,检查"if smaller than 17:00"
,但似乎并不那么简单。
答案 0 :(得分:4)
这个怎么样:
$start = strtotime('2011-05-01');
$end = strtotime('2011-12-31');
$times = array();
for ($i = $start; $i <= $end; $i += 24 * 3600)
{
if (date("D", $i) == "Sun" || date("D", $i) == "Sat")
{
continue;
}
for ($j = 9; $j <= 17; $j++)
{
$times []= date("Y-m-d $j:00:00", $i);
}
}
外部循环遍历给定时间段内的所有日子。在外循环中,我们检查一天是星期六还是星期日(周末),如果是,我们跳过那一天。如果不是周末,我们会遍历所有有效时间,并在我们前往阵列时添加完整的日期和时间。
答案 1 :(得分:1)
一些提示:
date("G", $some_timestamp)
以24小时格式为您提供当天的小时date("N", $some_timestamp)
为您提供星期几,1(星期一)至7(星期日) 编辑:您可以选择任意开始时间戳并添加3600以添加一小时,如果您的小时数大于17,则可以添加更大的步骤直到第二天早上,同样的一个周末,然后做一个while ($timestamp < $end_timestamp) {}
答案 2 :(得分:1)
$datetime = new DateTime(); // Set your start date here
do { // Iterate over .. dont know, a long time?
do { // Iterate over the week ...
$datetime->setTime(9,0,0);
do { // Iterate over the hours ...
echo $datetime->format('c') . PHP_EOL; // Do something with $datetime here
$datetime->add(new DateInterval('PT1H'));
} while ($datetime->format('G') < 18); // .. till < 18
$datetime->add(new DateInterval('P1D')); // next day
} while (!in_array($datetime->format('w'), array('0','6'))); // until we hit sunday or saturday
$datetime->add(new DateInterval('P2D')); // next monday
} while (true); // replace with your "end" expression
目前未经测试。
您也可以使用常见的区间字符串(例如1 hour
等)http://php.net/dateinterval.createfromdatestring
答案 3 :(得分:0)
您可以使用两个嵌套循环计算日期,并使用date()生成字符串。
答案 4 :(得分:0)
我会循环遍历所有日期,以小时为单位,从now
到年底,如下所示(伪代码,显然):
for n = now until end of year
if (date(n) is between 9:00 and 17:00) AND (if date(n) is not sat or sun)
add to array
end if
increment n by 1 hour
end
答案 5 :(得分:0)
我鼓励你使用精彩的DateTime
课程及其相关课程。在这里,您可以充分利用DatePeriod
:
<?php
$now = new DateTime('today'); // starting time 0.00 this morning
$endOfYear = new DateTime('31 December this year 23:00'); // end time
$interval = new DateInterval('PT1H'); // frequency -- every hour
$times = array();
foreach (new DatePeriod($now, $interval, $endOfYear ) as $datetime) {
// $datetime is a DateTime object for the hour and time in question
$dow = $datetime->format('w'); // 0 is Sunday
if (($dow == '0') || ($dow == '6')) {
continue; // miss Saturday and Sunday out
}
$time = $datetime->format('G'); // hour without leading 0
if (($time < '9') || ($time > '17')) {
continue;
}
$times[] = $datetime->format('r'); // output format
}
var_dump($times);
显然,您可以配置各种方面,尤其是输出格式。根据您的目的,您可能更喜欢将DateTime对象本身放入数组中。
答案 6 :(得分:0)
这是一个应该相当快的解决方案,因为它不使用字符串比较,并且在循环中只有两个函数调用:
function hours()
{
$start = mktime(0, 0, 0, date('n'), 1, date('Y'));
$end = mktime(0, 0, 0, 1, 1, date('Y') + 1);
$wday = date('w', $start);
$result = array();
for ($t = $start; $t < $end; $t += 3600 * 24) {
if (($wday > 0) && ($wday < 6)) {
for ($hour = 9; $hour <= 17; $hour++) {
$result[] = date('Y-m-d', $t) . sprintf(' %02d:00:00', $hour);
}
}
$wday = ($wday + 1) % 7;
}
return $result;
}