Created
April 19, 2012 03:06
-
-
Save ogijun/2418107 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: UTF-8 | |
class HolidayInfo | |
def initialize date | |
@date = date | |
@is_national = false | |
@name = "" | |
@is_substitute = false | |
end | |
attr_accessor :date, :is_national, :name, :is_substitute | |
end | |
module DateTimeUtil | |
def DateTimeUtil.equals_date a, b | |
return (a.year == b.year and a.month == b.month and a.day == b.day) | |
end | |
end | |
module JapaneseHolidays | |
def JapaneseHolidays.national_holiday_info date | |
info = HolidayInfo.new date | |
case date.month | |
when 1 | |
if date.year <= 1948 | |
if date.day == 3 | |
info.name = "元始祭" | |
elsif date.day == 5 | |
info.name = "新年宴會" | |
elsif date.year < 1913 and date.day == 30 | |
info.name = "孝明天皇祭" | |
end | |
elsif date.year < 2000 | |
if date.day == 1 | |
info.name = "元日" | |
elsif date.day == 15 | |
info.name = "成人の日" | |
end | |
else | |
if date.day == 1 | |
info.name = "元日" | |
elsif date.day >= 8 and date.day <= 14 and date.wday == 1 and date.year > 1999 | |
info.name = "成人の日" | |
end | |
end | |
when 2 | |
if date.year <= 1948 | |
if date.day == 11 | |
info.name = "紀元節" | |
end | |
elsif date.year > 1966 | |
if date.day == 11 | |
info.name = "建国記念の日" | |
elsif date.year == 1989 | |
if date.day == 24 | |
info.name = "大喪の礼" | |
end | |
end | |
end | |
when 3 | |
if date.year <= 1948 | |
if date.year >= 1900 and date.day == (date.year * 0.24242 - date.year / 4 + 35.84).to_i | |
info.name = "春季皇靈祭" | |
end | |
else | |
if date.year <= 2099 and date.day == (date.year * 0.24242 - date.year / 4 + 35.84).to_i | |
info.name = "春分の日" | |
end | |
end | |
when 4 | |
if date.year <= 1948 | |
if date.day == 3 | |
info.name = "神武天皇祭" | |
elsif date.day == 29 and date.year > 1926 | |
info.name = "天長節" | |
end | |
elsif date.year == 1959 and date.day == 10 | |
info.name = "明仁親王結婚の儀" | |
elsif date.year < 1989 | |
info.name = "天皇誕生日" if date.day == 29 | |
elsif date.year < 2007 | |
info.name = "みどりの日" if date.day == 29 | |
else | |
info.name = "昭和の日" if date.day == 29 | |
end | |
when 5 | |
if date.year > 1948 | |
if date.day == 3 | |
info.name = "憲法記念日" | |
elsif date.day == 5 | |
info.name = "こどもの日" | |
end | |
if date.year < 2007 | |
if date.year > 1985 and date.day == 4 and date.wday > 1 | |
info.name = "国民の休日" | |
end | |
else | |
info.name = "みどりの日" if date.day == 4 | |
end | |
end | |
when 6 | |
if date.day == 9 and date.year == 1993 | |
info.name = "徳仁親王結婚の儀" | |
end | |
when 7 | |
if date.year < 1926 and date.year > 1912 | |
if date.day == 30 | |
info.name = "明治天皇祭" | |
end | |
elsif date.year > 1995 | |
if date.year < 2003 | |
info.name = "海の日" if date.day == 20 | |
elsif date.day >= 15 and date.day <= 21 and date.wday == 1 | |
info.name = "海の日" | |
end | |
end | |
when 8 | |
if date.year < 1926 and date.year > 1912 | |
if date.day == 31 | |
info.name = "天長節" | |
end | |
end | |
when 9 | |
if date.year < 1948 | |
if date.year < 1879 and date.day == 17 | |
info.name = "神嘗祭" | |
elsif date.year >= 1900 and date.day == (date.year * 0.24204 - date.year / 4 + 39.01).to_i | |
info.name = "秋季皇靈祭" | |
end | |
else | |
if date.year <= 2099 and date.day == (date.year * 0.24204 - date.year / 4 + 39.01).to_i | |
info.name = "秋分の日" | |
elsif date.year > 1965 | |
if date.year < 2003 | |
info.name = "敬老の日" if date.day == 15 | |
elsif date.day >= 15 and date.day <= 21 and date.wday == 1 | |
info.name = "敬老の日" | |
elsif date.day >= 16 and date.day <= 22 and date.wday == 2 and | |
date.year <= 2099 and (date.day + 1) == (date.year * 0.24204 - date.year / 4 + 39.01).to_i | |
info.name = "国民の休日" | |
end | |
end | |
end | |
when 10 | |
if date.year <= 1947 | |
if date.year >= 1879 and date.day == 17 | |
info.name = "神嘗祭" | |
elsif date.year < 1927 and date.year > 1912 | |
info.name = "天長節祝日" if date.day == 31 | |
end | |
elsif date.year > 1965 | |
if date.year < 2000 | |
if date.day == 10 | |
info.name = "体育の日" | |
end | |
else | |
if date.day >= 8 and date.day <= 14 and date.wday == 1 | |
info.name = "体育の日" | |
end | |
end | |
end | |
when 11 | |
if date.year <= 1947 | |
if date.day == 23 | |
info.name = "新嘗祭" | |
elsif date.year == 1915 | |
case date.day | |
when 10 | |
info.name = "即位ノ禮" | |
when 14 | |
info.name = "大嘗祭" | |
when 16 | |
info.name = "即位禮及大嘗祭後大饗第一日" | |
end | |
elsif date.year < 1912 | |
info.name = "天長節" if date.day == 3 | |
elsif date.year > 1926 | |
if date.year == 1928 | |
case date.day | |
when 10 | |
info.name = "即位ノ禮" | |
when 14 | |
info.name = "大嘗祭" | |
when 16 | |
info.name = "即位禮及大嘗祭後大饗第一日" | |
end | |
else | |
info.name = "明治節" if date.day == 3 | |
end | |
end | |
else | |
if date.day == 3 | |
info.name = "文化の日" | |
elsif date.day == 23 | |
info.name = "勤労感謝の日" | |
elsif date.day == 12 and date.year == 1990 | |
info.name = "即位礼正殿の儀" | |
end | |
end | |
when 12 | |
if date.year <= 1947 | |
if date.year > 1926 | |
if date.day == 25 | |
info.name = "大正天皇祭" | |
end | |
end | |
elsif date.year > 1988 | |
if date.day == 23 | |
info.name = "天皇誕生日" | |
end | |
end | |
else | |
end | |
info.is_national = !info.name.empty? | |
return info | |
end | |
def JapaneseHolidays.check_substitute_holiday date | |
if date.wday == 0 or date.wday == 6 | |
return false | |
end | |
if (date.year < 1973 and (date.year == 1973 and date.month < 3)) | |
return false | |
end | |
alt = false | |
a_date = date | |
loop do | |
unless JapaneseHolidays.national_holiday_info(a_date - 1).is_national | |
break | |
end | |
if (a_date - 1).wday == 0 | |
alt = true | |
break | |
end | |
a_date -= 1 | |
break if date.year < 2007 | |
end | |
return alt | |
end | |
def JapaneseHolidays.holiday_info date | |
holiday_info = JapaneseHolidays.national_holiday_info date | |
if !holiday_info.is_national | |
holiday_info.is_substitute = JapaneseHolidays.check_substitute_holiday date | |
end | |
holiday_info | |
end | |
def get_holiday_info | |
if @holiday_info.nil? or !DateTimeUtil.equals_date(self, @holiday_info.date) | |
@holiday_info = JapaneseHolidays.holiday_info(self) | |
end | |
@holiday_info | |
end | |
def holiday? | |
return (weekend? or national_holiday? or substitute_holiday?) | |
end | |
def holiday | |
get_holiday_info.name | |
end | |
def weekend? | |
return (saturday? or sunday?) | |
end | |
def saturday? | |
return (wday == 6) | |
end | |
def sunday? | |
return (wday == 0) | |
end | |
def national_holiday? | |
get_holiday_info.is_national | |
end | |
def substitute_holiday? | |
get_holiday_info.is_substitute | |
end | |
end | |
if $0 == __FILE__ | |
require 'date' | |
class Date | |
include JapaneseHolidays | |
end | |
# class DateTime | |
# include JapaneseHolidays | |
# end | |
# | |
# class Time | |
# include JapaneseHolidays | |
# end | |
puts Date.parse('2012-01-01').extend(JapaneseHolidays).holiday | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment