我有array()
的工作日来重复我的事件。
[days_repeat] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
1,2,3是每周一,周二,周三应该重复的事件,但我也有
[start_date] => 2014-04-2
[end_date] => 2014-05-30
如您所见,开始日不是重复的第一天,如果是这样更容易,只需循环并制作日期并打破循环,当日期大于结束日期时,但也许您可以建议我一些好的策略来实现这一目标
天数重复数组只能包含工作日数字等等!
首先,将start_date
转换为时间戳。
然后使用 php date()
这样的函数:
echo date('w', $your_timestamp);
您将知道哪一天是 first_date、0(星期日)到 6(星期六)的一天。
然后只需循环并检查您的日常,检查它们是否与您的数组匹配。
试试这个:
$daysRepeat = array(1,2,3);
$startDate = '2014-04-02';
$endDate = '2014-05-30';
//Convert to timestamps;
$startDateTstamp = strtotime($startDate);
$endDateTstamp = strtotime($endDate);
//Loop through days between start and end date
$tstamp = $startDateTstamp;
while($tstamp < $endDateTstamp) {
//Calculate numerical representation of week day (1-7)
$weekDay = date('N', $tstamp);
if(in_array($weekDay, $daysRepeat)) {
print date('Y-m-d', $tstamp) . "<br />";
}
$tstamp += (60*60*24);
}
输出:
2014-04-02
2014-04-07
2014-04-08
2014-04-09
2014-04-14
2014-04-15
2014-04-16
2014-04-21
2014-04-22
2014-04-23
2014-04-28
2014-04-29
2014-04-30
2014-05-05
2014-05-06
2014-05-07
2014-05-12
2014-05-13
2014-05-14
2014-05-19
2014-05-20
2014-05-21
2014-05-26
2014-05-27
2014-05-28
如果你的数据代表一周内的天数(所以一周的第一天到一周的第七天),那么你只需要检查当前显示的日期,如果它是相同的"日数"
例如。
echo (new DateTime())->format("w");
将打印
1
周一
有关详细信息,请参阅文档。http://www.php.net/manual/en/function.date.php
因此,您只需要检查当前日期数字是否在您的重复数组中!
您可以使用以下代码实现此目的:
<?php
$days_repeat = array(
'1', // Monday
'2', // Tuesday
'3', // Wednesday
);
// first set timezone
date_default_timezone_set('UTC');
// Start date
$date = '2014-04-02';
// End date
$end_date = '2014-05-30';
while (strtotime($date) <= strtotime($end_date)) {
// first find out which day of the week it is (0=sunday; 1=monday ... 6=saturday)
$dateWeekDay = date("w", $date);
// convert sunday from 0 to 7 if needed
if ($dateWeekDay == 0) { $dateWeekDay = 7; }
// check if $days_repeat has current day
if (in_array($dateWeekDay, $days_repeat)) {
// do action as this day is in $days_repeat
echo date("Y-m-d"). ' is in $days_repeat';
}
// add +1 day and continue loop
$date = date("Y-m-d", strtotime("+1 day", strtotime($date)));
}
?>
方便的是,您是根据 ISO-8601 规范表示星期几。这意味着您可以使用 PHP 的内置date()
函数,而无需对您的格式进行额外的翻译。那很好。
接下来,您需要弄清楚如何将start_date
和end_date
转换为 PHP 可以理解的日期格式。看起来 mktime() 是你最好的选择——如果你不关心它们,将时间元素初始化为 0。
您现在可以按天迭代,如果date("N", $currentDay)
在您的通缉日期数组中,请在当天重复该事件(无论需要什么)。在这里,$currentDay
是您正在检查的循环时间戳。 date("N")
返回与 date() 手册页中指定的相同的 ISO-8601 格式的星期数。