可重复的事件 php.


Repeatable events php

我有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_dateend_date转换为 PHP 可以理解的日期格式。看起来 mktime() 是你最好的选择——如果你不关心它们,将时间元素初始化为 0。

您现在可以按天迭代,如果date("N", $currentDay)在您的通缉日期数组中,请在当天重复该事件(无论需要什么)。在这里,$currentDay是您正在检查的循环时间戳。 date("N") 返回与 date() 手册页中指定的相同的 ISO-8601 格式的星期数。