嵌入了PHP的闰年友好年/月/日选择选项标签


Leap year friendly year/month/day select option tags with PHP embedded

我正在尝试使用 PHP 编写代码以启用闰年友好的选择选项标签。例如,您选择一个年份,然后检查它是否是闰年,然后它显示一个下拉菜单(选择选项标签),前面是另一个 12 个月的选择选项标签。PHP 代码嵌入在 HTML 中。这是我在下面失败的尝试(我是PHP的新手):

<form method="post">    
<select name="year">
 <option value="" selected>Pick a year</option><!--Default-->
 <option value="2016">2016</option>
 <option value="2017">2017</option>
 <option value="2018">2018</option>
 <option value="2019">2019</option>
 <option value="2020">2020</option>
</select>
<select name="month">
 <option value="" selected>Pick a month</option><!--Default-->
 <!--Show all 12 months-->  
 <?php for( $i = 1; $i <= 12; $i++ ): ?>
 <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
 <?php endfor; ?>
</select>
<select name="day">
 <option value="" selected>Pick a day</option><!--Default-->
 <!--Show dates depending on the conditions below:-->
 <?php
 if ( $month == 1 || 3 || 5 || 7 || 8 || 10 || 12 )
 {
    //Show dates until 31
    for ( $i = 1; $i <= 31; $i++ )
    {
 ?>
 <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
 <?php
    }
 }
 elseif ( $month == 2 )
 {
    //Leap year
    if ( $year != "" && $year % 4 == 0 && $year % 100 == 0 && $year % 400 == 0 )
    {
        //Show dates until 29
        for ( $i = 1; $i <= 29; $i++ )
        {
            ?>
            <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
            <?php
        }
    }
    //Regular year (Non-leap year)
    else 
    {
        //Show dates until 28
        for ( $i = 1; $i <= 28; $i++ )
        {
            ?>
            <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
            <?php
        }
     }
}
elseif ( $month == 4 || 6 || 9 || 11 )
{
    //Show dates until 30
    for ( $i = 1; $i <= 30; $i++ )
    {
        ?>
        <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
        <?php
    }
 }
?>
</select>
<input type="submit" value="submit">
</form>

笔记:

我知道以上是不完整的代码,它不起作用。此外,我不知道如何从选择标签中定义$year$month$day。我应该这样做吗?如果是这样,我应该把它放在哪里?

<?php 
if( $_SERVER["REQUEST_METHOD"] == "POST" )    
{
    $year = $_POST['year'];
    $month = $_POST['month'];
    $day = $_POST['day'];
    //The rest of the php code?
}
?>

最好,我不想通过使用for循环来显示年份,例如月份和日期。这次我想手动完成(对不起,但如果您建议我应该使用 for 循环,感谢您的建议)。

我在闰年 2 月if块中写了$year =! "",因为我想逃避空的默认值被计算在内。

我热忱欢迎您的建议和指正,请帮助我:)

提前感谢!

据我所知,闰年:

/**
 * In the Gregorian calendar 3 criteria must be taken into account to identify leap years:
 *  1. The year is evenly divisible by 4;
 *  2. If the year can be evenly divided by 100, it is NOT a leap year, unless;
 *  3. The year is also evenly divisible by 400. Then it is a leap year.
 *
 * @param $year integer
 * @return bool
 */
private static function isLeapYear($year)
{
    // the rule was applied after 1582
    if ($year > 1582) {
        if (($year % 400 == 0 && $year % 100 != 0) || ($year % 4 == 0))
        {
            //"It is a leap year"
            return true;
        }
        else
        {
            return false;
            //"It is not a leap year"
        }
    }
    return false;
}

这行不通:

( $month == 1 || 3 || 5 || 7 || 8 || 10 || 12 )

这只会检查$month == 1,然后其他条件将被评估为 true,因为整数被计算为 true(并且 PHP 无法使用此代码将变量与布尔值进行比较)。

看起来您正在尝试获取每月的天数。这可以通过使用date()格式的DateTime::Format()轻松完成:

t返回给定月份的天数

$dt = new Datetime('2016-02-15');
print $dt->format('t');
// display "29"

例。

如果年份是闰,L返回1,否则0

$dt = new Datetime('2016-02-15');
print $dt->format('L');
// display "1"
$dt = new Datetime('2015-02-15');
print $dt->format('L');
// display "0"

例。

您可能不应该关心输入并显示所有年份,每月 12 个月和 31 天,并在提交数据后与checkdate()一起检查日期。