Linuxなどのメモ書き

Perl 祝日名の取得


Calendar::Japanese::Holiday

Calendar::Japanese::Holidayは祝日の一覧取得、祝日判定、祝日名の取得ができるPerl モジュールです。

CPANにアップ済。

概要

このモジュールで以下のことを行えます。

  • 指定年月の祝日一覧の取得
  • 指定日の祝日判定

祝日判定で祝日だった場合は、祝日名を返すので祝日名の取得もできます。

使用例

 

use Calendar::Japanese::Holiday;

# 祝日一覧の取得
$holidays = getHolidays(2008, 5);
$holidays = getHolidays(2008, 5, 1);

# 祝日かどうかの判定
$name = isHoliday(2007, 5, 5);

関数

  • getHolidays($year, $month [, $furikae])
指定した年月($year, $month)の祝日一覧を格納したハッシュへのリファレンスを返します。ハッシュのKeyが日付、値が祝日名になります。祝日がない場合は、空のハッシュへのリファレンスを返します。undefが返った場合はエラーです。$yearは1948以降のみサポートしています。1948より前を指定した場合は、undefが返ります。
$holidays = getHolidays(2008, 5);

返された$holidaysの内容:
$holidays = {
             '4' => "みどりの日",
             '3' => "憲法記念日",
             '5' => "こどもの日" 
            };
$furikaeを1(真)にして呼び出すと振替休日も一緒に返すようになります(以下、参照)。省略時は偽で振替休日は含めません。
$holidays = getHolidays(2008, 5, 1);

返された$holidaysの内容:
$holidays = {
             '6' => "振替",
             '4' => "みどりの日",
             '3' => "憲法記念日",
             '5' => "こどもの日" 
            };

 

  • isHoliday($year, $month, $day [, $furikae])

指定した日が祝日かどうかを調べます。祝日の場合は祝日名を返します。祝日でなければ、undefを返します。

$furikaeはgetHolidays()と同じで、真を指定すると振替休日となる日についても祝日と判定するようになります("振替"が返る)。

$name = isHoliday(2007, 5, 5);

返された$nameの内容
$name = "こどもの日"

その他

祝日はその年に応じて移動したりする場合がありますが、本モジュールではこれらの情報も正しく返します。

例えば4月29日は1989〜2006年までは「みどりの日」でしたが、2007年からは「昭和の日」となりました(「みどりの日」は5月4日に移動)。これらの情報を正しく取得できるか、以下のスクリプトで試してみます。

use Calendar::Japanese::Holiday;
use open OUT  => ":utf8";
use open ":std";

print "2006/4/29: ".isHoliday(2006, 4, 29), "\n";
print "2007/4/29: ".isHoliday(2007, 4, 29), "\n";
print "2007/5/4:  ".isHoliday(2007, 5,  4), "\n";

上記のスクリプトを実行すると、以下のように年に応じた祝日名を取得できているのがわかります。

2006/4/29: みどりの日
2007/4/29: 昭和の日
2007/5/4:  みどりの日

 簡易サンプル

カレンダー表示をする簡易サンプル。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Time::Local;
use Calendar::Japanese::Holiday;

my ($year, $mon) = (2007, 5);

my $start = 1 - (localtime(timelocal(0, 0, 0, 1, $mon - 1, $year)))[6];
my @holidays;
foreach my $day ($start .. Calendar::Japanese::Holiday::days_in_month($year, $mon)) {
    printf("%2s          ", $day >= 1 ? $day : ' ');

    push @holidays, (isHoliday($year, $mon, $day) or "");

    if (@holidays >= 7) {
	print "\n";
	print Encode::encode("utf8", $_."\x{3000}" x (6 - length $_))
	  foreach (@holidays);
	print "\n";
	@holidays = ();
    }
}
print "\n";

上記のスクリプトを実行すると、以下のようなカレンダーが表示される。

                         1           2           3           4           5          
                        憲法記念日 みどりの日 こどもの日 
 6           7           8           9          10          11          12          
                                          
13          14          15          16          17          18          19          
                                          
20          21          22          23          24          25          26          
                                          
27          28          29          30          31

変更履歴

0.06

引数の型が文字列の場合に正常動作しないのを修正

例: isHoliday('2019', '02', '11')

Yuki Yoshidaさんご指摘ありがとうございます。

0.05

2019-2021年の祝日に対応

  • 2019年は主に天皇即位に関する祝日の変更への対応
  • 2020年は主にオリンピックに関連しての祝日の変更への対応

最近のバージョンのPerlでwarningが出るようになっていたのを修正

修正版/パッチをご提供いただいたyamamoto/melonsodeさんありがとうございました。

CPANのissueでご連絡パッチをご提供いただいたnipotanさんもありがとうございます。

0.04

山の日に対応

0.03

サポート年を1948年以降に変更
以下の祝日をサポート
  • 1959年4月10日 - 皇太子明仁親王の結婚の儀
  • 1989年2月24日 - 昭和天皇の大喪の礼
  • 1990年11月12日 - 即位礼正殿の儀
  • 1993年6月9日 - 皇太子徳仁親王の結婚の儀
これらはfbisさんの指摘/提案。どうもありがとうございます。


0.02

POD修正

0.01

初版リリース

github

https://github.com/kztomita/Calendar-Japanese-Holiday にリポジトリをアップしました。差分等を確認したい場合は、こちらからご確認ください。

Subversionからのコンバートやその他の事情のため、v0.03以降のみとなります。

 


最終更新 2019/02/03 01:57:57 - kztomita
(2007/06/15 11:20:36 作成)


リンク

その他のWiki
Linuxメモ
Xnuメモ

会社
(有)ビットハイブ
受託開発やってます。

よくやる仕事

・Webシステム開発(LAMP環境)
・Linuxサーバー設定関連
サーバー移転作業代行

開発事例にデジタルカタログ/マンガビューワーを追加しました。

draggable.jsのスマホ対応版デモページを追加しました。説明はこちら

検索

Adsense
最近のコメント