【问题标题】:PHP - How to check whether a year is bisect (i.e. a leap year)?PHP - 如何检查一年是否平分(即闰年)?
【发布时间】:2020-12-16 22:05:20
【问题描述】:

如何在php中检查年份是否平分(即闰年)?

【问题讨论】:

  • 年份是“闰年”,如果它们可以被 4(或 400)整除,但不能被 100 整除。

标签: php


【解决方案1】:

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

// L will return 1 if it is a leap year, 0 otherwise
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.';

如果这对你有用,请告诉我,干杯!

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

【讨论】:

  • 只是让你知道,2400 将返回 0。所以它在那里失败了。
【解决方案2】:

平分年闰年的别称。使用L 格式化程序,其中$year 是您要测试的年份:

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

调整两者之间的不一致 日历和季节,朱利安 日历使用的计算 希腊天文学家索西金 基于采用 365.25 天 年:3 年 365 天,然后是 一年366天,补天 总是在 24 日之后添加 二月 (sexto ante calendas Martiis = 三月日历前的第六天)被称为 bis sexto(the 第六天之二),因此得名 平分年和平分日为 闰日。一年被划分为 12 月,交替 31 和 30 天和二月,在正常情况下 年、29 天和 30 天平分 年。

后来,八个月的时候 献给奥古斯都皇帝 (八月),这个月是由 31 与 7 月相匹配的天数 献给朱利叶斯·凯撒。这就是为什么 二月由 28 天组成,有 平分年份为 29 天。

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

【讨论】:

    【解决方案3】:
    function is_leap_year($year)
    {
        return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year %400) == 0)));
    }
    

    【讨论】:

    • 请注意,此代码比此处给出的其他代码快 4.9 倍(使用日期转换),并且从 101 年到 99999 年输出完全相同的结果。
    【解决方案4】:

    使用DateTime 类:

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

    【讨论】:

      【解决方案5】:

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

      同时儒略历年有 365,25,公历年有 365,2422。因此,公历年比儒略年短 11 分钟。闰年的一般规则(年/4 必须是整数)并非始终有效。

      Year/4
      Year/100 & Year/400
      

      所以大部分年份/100 不是闰年。

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

      Year >= 1583
      

      由于公历于 1582 年被命令使用,而今年受到该日历开始使用所引起的变化的影响(有 10 月 4 日星期四和 10 月 15 日 - 之间的日子删除) , 1583 是可以算作完全公历的第一年(在公历中)。但我决定不测试这个条件,因为这个条件可能应该在测试闰年之前测试 - 如果不确定年份是否按照公历计算。


      对于这两种日历,都可以编写自己的函数(或独立的静态方法),结果应该可能与使用 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),结果是一样的。

      这种闰年的计算是按照公历,而不是儒略历。

      【讨论】:

      • 不是一个很好的解决方案,因为对于这么简单的事情需要太多的代码,但为了认可您出色的研究工作而受到支持。
      【解决方案6】:

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

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

      它返回完全相同的结果:

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

      从 101 年到 999999 年,但速度快了大约 30 倍。

      【讨论】:

        【解决方案7】:
        $isLeapYear = fn($year) => $year % 400 === 0 || ($year % 100 !== 0 && $year % 4 === 0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-17
          • 2022-11-14
          • 1970-01-01
          • 2013-04-27
          • 2022-10-02
          • 1970-01-01
          • 2018-10-20
          • 2022-12-10
          相关资源
          最近更新 更多