PHP - 如何检查一年是否是二等分(即闰年)?

时间:2011-04-15 17:11:09

标签: php

如何在php中检查一年是否是二等分(即闰年)?

7 个答案:

答案 0 :(得分:22)

您可以使用PHP的date()函数来执行此操作...

// L will return 1 or 0 for leap years
echo date('L');

// use your own timestamp
echo date('L', strtotime('last year'));

// for specific year
$year = 1999;
$leap = date('L', mktime(0, 0, 0, 1, 1, $year));
echo $year . ' ' . ($leap ? 'is' : 'is not') . ' a leap year.';

让我知道这是否适合你,干杯!

更新:添加特定年份的示例

答案 1 :(得分:13)

bisect年闰年的另一个名称。使用L格式化程序,其中$year是您正在测试的年份:

echo (date('L', strtotime("$year-01-01")) ? 'Yes' : 'No');
  

调整之间的不一致   日历和季节,朱利安   日历使用了计算   希腊天文学家Sosigene和   基于365.25天的采用   年:365天的3年随后   一年366天,补充日   总是在24日之后添加   二月(sexto ante calendas Martiis   =三月的calends之前的第六天被称为bis sexto(the   第六天之二),因此的名字   平分年和平分日   闰日。这一年分为12年   几个月,交替31和30   天和二月,正常   在bisect中年,29天和30天   年份。

     

后来,第八个月的时候   致力于奥古斯都皇帝   (8月),这个月是31岁   七月,一个月匹配的日子   致力于朱利叶斯凯撒。这就是为什么   二月是28天,有   两年后的29天。

http://news.softpedia.com/news/The-History-of-Modern-Calendar-and-Bisect-Year-79892.shtml

答案 2 :(得分:4)

使用DateTime类:

$year = 2000;
$isLeap = DateTime::createFromFormat('Y', $year)->format('L') === "1";
var_dump($isLeap); // bool(true)

答案 3 :(得分:3)

function is_leap_year($year)
{
    return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year %400) == 0)));
}

答案 4 :(得分:1)

检查年份是否为leap年的问题是,是否使用儒略历或公历。

朱利安历法中的同期年份为365,25,公历历法中的同期年份为365,2422。因此,公历年比儒略短11分钟。而且leap年的通用规则(year / 4必须为整数)在任何时候都无效。

Year/4
Year/100 & Year/400

因此,大多数年份中Year / 100不是are年。

此外,这项检查还有另一个重要条件。

Year >= 1583

由于公历在1582年被命令使用,而今年则因开始使用该日历而发生变化(从10月4日星期四至10月15日,这几天之间被删除了)。 ,公元1583年是完全公历的第一年(在公历中)。但是我决定不测试这种情况,因为这种情况可能应该在测试leap年之前进行测试-如果不确定是否根据公历来计算年份。


对于两个日历,都可以编写自己的函数(或独立的静态方法),并且结果可能与使用PHP的类相同。

而且,使用自己的函数/方法将花费较短的代码。

public static function Is_LeapYear($Year = 1583)
{
    $LeapYear = FALSE;

    if(CheckTypes::Is_Integer($Year / 4))
    {
        if(CheckTypes::Is_Integer($Year / 100) && !CheckTypes::Is_Integer($Year / 400))
        {
            $LeapYear = FALSE;
        }
        else
        {
            $LeapYear = TRUE;
        }
    }
    else
    {
        $LeapYear = FALSE;
    }

    return $LeapYear;
}

CheckTypes是我自己的用于多类型检查的类(其他方法允许进行多类型检查)。 Is_Integer(由于一种类型检查)等于PHP内置函数中的is_integer。因此,CheckTypes::Is_Integer($Year / 4)可以替换为is_integer($Year / 4),结果将相同。

This年的计算是根据公历而不是儒略历。

答案 5 :(得分:0)

如果您关心性能,更快的方法是:

!($year % 4) && ($year % 100 || !($year % 400))

它返回与以下结果完全相同的结果:

(bool) date('L', mktime(0, 0, 0, 1, 1, $year))

从101年到999999年,但速度要快30倍。

答案 6 :(得分:0)

$isLeapYear = fn($year) => $year % 400 === 0 || ($year % 100 !== 0 && $year % 4 === 0)