选择框以PHP中的当月开头的月份和年份

时间:2015-12-03 06:55:47

标签: php wordpress date

我希望你们能帮助我解决PHP和Wordpress问题。目前我有2个选择框,来自日期,另外日期,它们列出了月份和年份。目前日期从当年1月开始,但我需要它们从当前月份和年份开始,然后打印2年。

这是当前的代码:

<div class="medium-4 small-6 columns">
  <label class="align-left">
    From:
    <?php
      $select_month_control = '<select name="from_date">';
      for($x = date("Y"); $x <= date("Y", strtotime('+1 year')); $x++) {
        for($y = 1; $y <= 12; $y++) {
          $month_val = $x.str_pad($y, 2, "0", STR_PAD_LEFT).'01';
          $select_month_control.= '<option value="' . $month_val . '" ';
          if ($from_date === $month_val) {
            $select_month_control .= 'selected="selected">';
          }
          else {
            $select_month_control .= '>';
          }
          $select_month_control.= date('F',mktime(0,0,0,$y,1,$year)). " " . $x .' </option>';
        }
      }
      $select_month_control.= '</select>';
      echo $select_month_control;
    ?>
  </label>
</div>
<div class="medium-4 small-6 columns">
  <label class="align-left">
    To:
    <?php
      $select_month_control = '<select name="to_date">';
      $max_x = date("Y", strtotime('+2 year'));
      for($x = date("Y"); $x <= $max_x; $x++) {
        for($y = 1; $y <= 12; $y++) {
          $month_val = $x.str_pad($y, 2, "0", STR_PAD_LEFT).'01';
          $select_month_control.= '<option value="' . $month_val . '" ';
          if ($to_date === $month_val) {
            $select_month_control .= 'selected="selected">';
          }
          else if (empty($to_date) && $x == $max_x && $y === 12) {
            $select_month_control .= 'selected="selected">';
          }
          else {
            $select_month_control .= '>';
          }
          $select_month_control.= date('F',mktime(0,0,0,($y + 1),0,$year)). " " . $x .' </option>';
        }
      }
      $select_month_control.= '</select>';
      echo $select_month_control;
    ?>
  </label>
</div>

因此,如果今天访问该网站,则选择框将从2015年12月开始,到2017年12月结束,所有月份都介于两者之间。如果有人能够指出我如何将To Date更改为月份的最后一天而不是本月的第一天,那么这对我来说也是非常有帮助的。

任何想法都将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:1)

也许您可以使用DateTimeDateIntervalDatePeriod来生成所选元素的日期。

对于DateInterval,您可以像这样指定1个月:DateInterval('P1M');

'P1M'代表:

  “期间

P      持续时间

1

     几个月

M

     

http://php.net/manual/en/dateinterval.construct.php

然后,您可以创建DatePeriod并使用foreach循环来创建<option>元素。

我添加了一个参数$formatUseLastDayOfMonth,将“收件人”日期设置为该月的最后一天。这是一个可以使用 t 选项在format方法中指定的选项。

来自文档:

  

使用 t 表示给定月份的天数   (function.date

因为你使用了select元素2次,所以我创建了一个函数,它将select元素作为字符串返回。

例如:

<?php
/**
 * Create html select element which will contain options
 * for the given upcoming $numberOfMonths. The current month will be the default.
 *
 * @param int $numberOfMonths
 * @param int $selectedMonth
 * @param bool $formatUseLastDayOfMonth
 *
 * @return string
 */
function getSelectForMonths($numberOfMonths, $selectedMonth = 0, $formatUseLastDayOfMonth = false)
{
    // Add 1 month extra because the $datePeriod we are about to loop excludes the endDate
    $numberOfMonths+=1;
    $dateFormat = $formatUseLastDayOfMonth ? "Ymt" : "Ym01";
    $end = new DateTime();
    $end->modify(sprintf("+%s month", $numberOfMonths));

    $datePeriod = new DatePeriod(
        new DateTime(),
        new DateInterval('P1M'),
        $end
    );

    $selectMonthControl = '<select name="from_date">';
    $monthCounter = 0;
    foreach ($datePeriod as $date) {
        $selectMonthControl .= sprintf(
            "<option value='%s'%s>%s</option>",
            $date->format($dateFormat),
            $selectedMonth === $monthCounter ? 'selected="selected"' : '',
            $date->format('F Y')
        );
        $monthCounter++;
    }
    $selectMonthControl .= "</select>";

    return $selectMonthControl;
}
?>

然后你可以像这样使用它:

<div class="medium-4 small-6 columns">
    <label class="align-left">
        From:
        <?php echo getSelectForMonths(24); ?>
    </label>
</div>
<div class="medium-4 small-6 columns">
    <label class="align-left">
        To:
        <?php echo getSelectForMonths(24, 24, true); ?>
    </label>
</div>