如何重复每月同一天的会议或活动

时间:2011-07-08 11:00:01

标签: php mysql

我正在尝试为我的应用程序创建新模块,用户可以在创建活动时每月重复一次事件。我面临的问题是每个月的同一天重复这一事件。我写的作品很好。但不要重复每个月那一周的同一天。举个例子,如果我在2011年7月7日创建一个周四的活动,如果我选择每月重复,它应该在2011年8月4日(也是周四)创建下一个活动。但我找不到在月份同一天重复的方法。它仅适用于同一日期,例如,如果我选择7月7日,它将创建8月7日。我想不出办法检查这一天。请在下面找到我的问题。

INSERT INTO EVENT(name, date, usr, repfrequent) VALUES ('test', DATE_ADD('2011-8-7', INTERVAL 1 MONTH), 'Monthly');

上述查询重复下个月的同一日期,而不是下个月的星期四。如果有人知道答案,请告诉我。

6 个答案:

答案 0 :(得分:2)

首先,恕我直言,你必须回答“最重要的问题”。

每月的含义是什么?

听起来可能很愚蠢,但是,我想,你不希望你的活动每月重复一次。

<强> Scenario1

你希望他们每4周重复一次。 我为什么这么认为?因为WEEKDAY对你来说非常重要,而不是那个月,因为这是最快的解决方案。如果是这种情况,请不要使用月份,使用4周作为月份间隔:

<?php
//
date_default_timezone_set('Europe/Berlin');

//
$startDate = '2012-01-06'; // friday

// Show event dates for next 2 years
// one year = ~52 weeks
// 52 weeks / 4 weeks intervals = 13 months ;)
// So, two years = 26 intervals with 4 weeks
//
for($i = 1; $i <= 26; $i++)
{
    $weekOffset = $i * 4;
    $nextDate = strtotime("{$startDate} +{$weekOffset} weeks");
    echo date('Y-m-d l', $nextDate) . PHP_EOL;
}
?>

结果:

2012-02-03 Friday
2012-03-02 Friday *
2012-03-30 Friday *
2012-04-27 Friday
2012-05-25 Friday
2012-06-22 Friday
2012-07-20 Friday
2012-08-17 Friday
2012-09-14 Friday
2012-10-12 Friday
2012-11-09 Friday
2012-12-07 Friday
2013-01-04 Friday
2013-02-01 Friday
2013-03-01 Friday *
2013-03-29 Friday *
2013-04-26 Friday
2013-05-24 Friday
2013-06-21 Friday
2013-07-19 Friday
2013-08-16 Friday
2013-09-13 Friday
2013-10-11 Friday
2013-11-08 Friday
2013-12-06 Friday

正如您所看到的,当某个事件每月发生两次(标有*)时,会出现这种情况。 如果你能接受这个,那就这样做吧。

场景2

你希望他们每隔一个|第二个|第三个|第四个星期一|星期二|星期三|星期四|星期五|星期六,一个月的日子(1-31)不重复。

这就是为什么我建议使用第一个场景。因为,如果我在一个月的第5个(!)星期日创建一个活动怎么办?请查看您的日历,例如2012年1月有5个星期日,您希望您的应用做什么,当我在2012-01-29创建“每月”活动时,这是一个星期天,2012年1月的第5个星期日2012年2月只有四个星期天...

这就是为什么我不认为你希望你的活动每月重复一次。错误的命名通常会导致错误的方向; - )

Threre是更多场景,但他们需要编码,日期计算等等。我的观点是,你应该首先回答“最重要的问题”给自己: - )

答案 1 :(得分:0)

每n周而不是n个月重复会更容易。

答案 2 :(得分:0)

我知道您可以使用Zeller's Congruence确定任何指定日期的星期几。希望这会有所帮助。

答案 3 :(得分:0)

我正在尝试的东西:

$dow = date('w',mktime(0, 0, 0, date("m",strtotime($date)), date("d",strtotime($date)), date("y",strtotime($date))));
$weeknum = date ("W",mktime(0, 0, 0, date("m",strtotime($date)), date("d",strtotime($date)), date("y",strtotime($date)))) -    date("W",strtotime(date("Y-m-01")));
$nextMonthDay = date ("m/d/y",strtotime("$weeknum week $dow", strtotime("2011-09-01")));

您需要在星期一和星期日的最后一行中替换$ dow,这可以通过关联数组来完成。然后,您可以在最后一行中的年/月值上迭代到未来,并在表中创建行。

答案 4 :(得分:0)

这不是很困难。如果您有日期,请计算它是哪一周(1-7天是第一周,8-14是第2周等)

然后添加28天。再次计算。如果它在同一周内,请保留它。如果不再增加7天。

答案 5 :(得分:0)

您应该使用PHP将日期放入数组中。

  1. 查找当月的天数:http://php.net/manual/en/function.cal-days-in-month.php

  2. 使用数组将一天与每个日期相关联,您可能还希望将日期戳与每个实例相关联。

    $nextmonth[7]['day']='Thursday';
    $nextmonth[8]['day']='Friday';
    ...
    
  3. 运行数组并根据用户之前指定的日期搜索当天第四个实例的第一个,第二个,第三个。例如:2011年7月7日是7月的第一个星期四,发现下个月阵列中的第一个星期四。