我希望你们能帮助我解决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更改为月份的最后一天而不是本月的第一天,那么这对我来说也是非常有帮助的。
任何想法都将不胜感激。
非常感谢!
答案 0 :(得分:1)
也许您可以使用DateTime,DateInterval和DatePeriod来生成所选元素的日期。
对于DateInterval
,您可以像这样指定1个月:DateInterval('P1M');
'P1M'代表:
“期间P 持续时间
1
几个月M
然后,您可以创建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>