【问题标题】:Repeatable events php可重复事件 php
【发布时间】:2014-03-31 09:21:38
【问题描述】:

我有array() 工作日重复我的活动。

[days_repeat] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
    )

1,2,3 是每周一、二、三应该重复的事件,但我也有

[start_date] => 2014-04-2
[end_date] => 2014-05-30

如您所见,开始日不是重复的第一天,如果那时更容易,只需循环并制作日期并中断循环,当日期大于结束日期时,但也许您可以建议我有一些很好的策略来实现这一目标

Days 重复数组只能包含星期几数字等等!

【问题讨论】:

    标签: php loops


    【解决方案1】:

    首先,将start_date 转换为时间戳。

    然后使用 php date() 函数这样:

    echo date('w', $your_timestamp);
    

    您会知道 first_date 是哪一天,0(星期日)到 6(星期六)。

    然后只需循环并检查您的日子是否与您的数组匹配。

    【讨论】:

      【解决方案2】:

      试试这个:

      $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
      

      【讨论】:

        【解决方案3】:

        如果您的数据代表一周内的几天(所以一周的第一天到一周的第七天),那么您只需要检查当前显示的日期,如果它是相同的“天数”

        例如。

        echo (new DateTime())->format("w");
        

        将打印

        1
        

        星期一

        有关更多信息,请参阅文档。 http://www.php.net/manual/en/function.date.php

        所以您只需检查当前日期是否在您的重复数组中!

        【讨论】:

          【解决方案4】:

          您可以使用以下代码实现此目的:

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

          【讨论】:

            【解决方案5】:

            根据 ISO-8601 规范,您可以方便地表示星期几。这意味着您可以使用 PHP 的内置 date() 函数,而无需额外转换为您的格式。挺好的。

            接下来,您需要弄清楚如何将您的start_dateend_date 转换为PHP 可以理解的日期格式。看起来mktime() 是您最好的选择 - 如果您不关心时间元素,请将它们初始化为 0。

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

            【讨论】:

              猜你喜欢
              • 2012-12-23
              • 1970-01-01
              • 2012-08-10
              • 2013-04-17
              • 2010-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-10
              相关资源
              最近更新 更多