閏年(うるう年)の判定
そふぃのPHP入門 >> サンプルスクリプト >> 日付・時刻関連 >> 閏年(うるう年)の判定

閏年(うるう年)の判定

閏年(うるう年)の判定

  1. $year%4 == 0 && $year%100 != 0 || $year%400 == 0
  2. checkdate()
  3. date()の書式"L"

閏年(うるう年)の判定

1年は通常365日ですが閏年(うるう年)という年が約4年に1回あり、うるう年には平年にはない2月29日があります。

2月29日の事を閏日(うるう日)と呼び、これは太陽暦と地球の自転速度とのずれを修正するために設けられる日の事です。

閏年(うるう年)の判定には複数の条件が必要で、単純に4年に1回と計算すればいいわけではありません。うるう年を判定する条件には以下のようなものがあります。

  • 西暦が4で割り切れる年はうるう年である。
  • ただし、100で割り切れる年は平年である(うるう年ではない)。
  • また、400で割り切れる年はうるう年である。

これをPHPの条件式に直すと

  1. $year%4 == 0 && $year%100 != 0 || $year%400 == 0

のようになりますので、PHPのif文で書くと以下のようになります。

  1. <?php
  2. $year = date("Y"); // 今年の西暦が4桁で代入されます
  3. if ( $year%4 == 0 && $year%100 != 0 || $year%400 == 0 ) {
  4.     echo "今年はうるう年です";
  5. } else {
  6.     echo "今年はうるう年ではありません。";
  7. }
  8. ?>

出力結果

今年はうるう年ではありません。

date()関数で現在時刻を4桁の西暦に直し、うるう年の判定に使用しています。

参考関数

  • date() ---- 日付・時刻を書式化する

書式

  • string date( string format [, int timestamp ] )

checkdate()による判定

上記のように直接計算式を記述してもうるう年の判定はできるのですが、PHPのcheckdate()関数を使うともう少し楽に判定することができます。

参考関数

  • checkdate() ---- 日付の妥当性を確認する(グレゴリオ暦)

書式

  • bool checkdate( int month , int day , int year )

checkdate()は日付の妥当性を確認してくれる関数です。有効な日付ならtrue、無効な日付ならfalseが返されますので、これで対象の年の2月29日をチェックします。

ややこしい判定式を覚えるよりも楽に閏年の判定が行えますのでとても便利です。

  1. <?php
  2. $year = date("Y"); // 今年の西暦が4桁で代入されます
  3. if (checkdate(2, 29, $year)) {
  4.     echo "うるう年です";
  5. } else {
  6.     echo "うるう年ではありません。";
  7. }
  8. ?>

出力結果

うるう年ではありません。

date()の書式"L"による判定

checkdate()を使った判定方法は非常に直感的で使いやすいですが、実はdate()関数にはうるう年かどうかを判定してくれる書式が用意されています。

  1. <?php
  2. echo date("L") ? "閏年です" : "平年です"; // Lは閏年の判定をしてくれる
  3. ?>

出力結果

平年です

こちらも覚えてしまえば非常に有効に使えます。

現在時刻以外を判定したい場合はmktime()strtotime()を使うと目的の年のタイムスタンプを取得できます。

データが年、月、日に分かれている場合はmktime()が便利です。

参考関数

  • mktime() ---- 指定した日時のUNIXタイムスタンプを取得する

書式

  • int mktime( [ int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst ]]]]]]] )

strtotime()は文字列からタイムスタンプを取得できます。年月日が文字列データで保存されている場合に役に立ちます。

参考関数

  • strtotime() ---- 英文形式の日時をUNIXタイムスタンプに変換する

書式

  • int strtotime( string time [, int now ] )