2015-12-03 240 views
0

我希望你们可以帮我解决PHP和Wordpress的问题。目前我有2个选择框,日期和另一个日期这列出了一个月和一年。目前的日期从今年一月份开始,但我需要它们在当前的月份和年份开始,然后打印两年。选择框月份和月份从PHP当前月份开始

下面是当前的代码:

<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

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

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

'P1M' 代表:

P对于“期间

的时间

M fo [R个月

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

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

我已经添加了一个参数$formatUseLastDayOfMonth来将'To'日期设置为月的最后一天。这是一个选项,可以使用t选项在format方法中指定。

从文档:

使用牛逼的天在特定的月份 (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>