Skip to content

Instantly share code, notes, and snippets.

@ogijun
Created April 19, 2012 03:06
Show Gist options
  • Save ogijun/2418107 to your computer and use it in GitHub Desktop.
Save ogijun/2418107 to your computer and use it in GitHub Desktop.
# 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