Add a difinition for Japan.

This commit is contained in:
Tatsuki Sugiura 2010-12-25 17:33:16 +09:00
parent c7e7f0fe36
commit c3bf468593
5 changed files with 381 additions and 18 deletions

View file

@ -26,3 +26,4 @@ defs:
North_America: ['ca.yaml', 'mx.yaml', 'us.yaml', 'north_america_informal.yaml']
Scandinavia: ['dk.yaml', 'is.yaml', 'no.yaml', 'se.yaml']
Europe: ['cz.yaml', 'dk.yaml', 'de.yaml', 'es.yaml', 'fr.yaml', 'gb.yaml', 'ie.yaml', 'is.yaml', 'it.yaml', 'nl.yaml', 'no.yaml', 'pt.yaml']
JP: ['jp.yaml']

202
data/jp.yaml Normal file
View file

@ -0,0 +1,202 @@
# Japanese holiday definitions for Ruby Holiday gem.
# Reference: http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm
#
# This difinition can calculate current Japanese holidays,
# don't compat with past changes of Japan Holiday Act.
#
# CHANGES:
# 2010-12-25: Initial version by Tatsuki Sugiura <sugi@nemui.org>
#
---
months:
1:
- name: 元日
regions: [jp]
mday: 1
- name: 成人の日
regions: [jp]
wday: 1
week: 2
2:
- name: 建国記念日
regions: [jp]
mday: 11
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 2, 11)
3:
- name: 春分の日
regions: [jp]
function: jp_vernal_equinox_day(year)
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(Holidays.jp_vernal_equinox_day(year))
4:
- name: 昭和の日
regions: [jp]
mday: 29
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 4, 29)
5:
- name: 憲法記念日
regions: [jp]
mday: 3
- name: みどりの日
regions: [jp]
mday: 4
- name: こどもの日
regions: [jp]
mday: 5
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 5, 3)
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 5, 5)
7:
- name: 海の日
regions: [jp]
wday: 1
week: 3
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 7, Date.calculate_mday(year, 7, 3, 1))
9:
- name: 敬老の日
regions: [jp]
wday: 1
week: 3
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 9, Date.calculate_mday(year, 9, 3, 1))
- name: 国民の休日
regions: [jp]
function: jp_citizons_holiday(year)
- name: 秋分の日
regions: [jp]
function: jp_national_culture_day(year)
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(Holidays.jp_national_culture_day(year))
10:
- name: 体育の日
regions: [jp]
wday: 1
week: 2
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 10, Date.calculate_mday(year, 10, 2, 1))
11:
- name: 文化の日
regions: [jp]
mday: 3
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 11, 3)
- name: 勤労感謝の日
regions: [jp]
mday: 23
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 11, 23)
12:
- name: 天皇誕生日
regions: [jp]
mday: 23
- name: 振替休日
regions: [jp]
function: jp_substitute_holiday(year, 12, 23)
methods:
jp_vernal_equinox_day: |
def self.jp_vernal_equinox_day(year)
day =
case year
when 1851..1899
19.8277
when 1900..1979
20.8357
when 1980..2099
20.8431
when 2100..2150
21.8510
else
raise IndexError.new("Out of range")
end
day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
day = day.floor
Date.civil(year, 3, day)
end
jp_national_culture_day: |
def self.jp_national_culture_day(year)
day =
case year
when 1851..1899
22.2588
when 1900..1979
23.2588
when 1980..2099
23.2488
when 2100..2150
24.2488
else
raise IndexError.new("Out of range")
end
day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
day = day.floor
Date.civil(year, 9, day)
end
jp_citizons_holiday: |
def self.jp_citizons_holiday(year)
year < 2003 and return nil
ncd = Holidays.jp_national_culture_day(year)
if ncd.wday == 3
ncd - 1
else
nil
end
end
jp_substitute_holiday: |
def self.jp_substitute_holiday(*date)
date = date[0].kind_of?(Date) ? date.first : Date.civil(*date)
date.wday == 0 ? date+1 : nil
end
tests: |
{Date.civil(2008,1,1) => '元日',
Date.civil(2010,1,11) => '成人の日',
Date.civil(2008,2,11) => '建国記念日',
Date.civil(2008,4,29) => '昭和の日',
Date.civil(2008,5,3) => '憲法記念日',
Date.civil(2008,5,5) => 'こどもの日',
Date.civil(2010,7,19) => '海の日',
Date.civil(2010,9,20) => '敬老の日',
Date.civil(2010,10,11) => '体育の日',
Date.civil(2008,11,3) => '文化の日',
Date.civil(2008,11,23) => '勤労感謝の日',
Date.civil(2008,12,23) => '天皇誕生日',
Date.civil(2010,3,22) => '振替休日',
Date.civil(2008,11,24) => '振替休日',
}.each do |date, name|
assert_equal name, (Holidays.on(date, :jp, :informal)[0] || {})[:name]
end
# vernal equinox day
[Date.civil(2004,3,20), Date.civil(2005,3,20), Date.civil(2006,3,21),
Date.civil(2007,3,21), Date.civil(2008,3,20), Date.civil(2009,3,20),
Date.civil(2010,3,21)].each do |date|
assert_equal '春分の日', Holidays.on(date, :jp)[0][:name]
end
# national culture day
[Date.civil(2004,9,23), Date.civil(2005,9,23), Date.civil(2006,9,23),
Date.civil(2007,9,23), Date.civil(2008,9,23), Date.civil(2009,9,23),
Date.civil(2010,9,23), Date.civil(2011,9,23), Date.civil(2012,9,22),
Date.civil(2013,9,23)].each do |date|
assert_equal '秋分の日', Holidays.on(date, :jp)[0][:name]
end
# citizons holiday
[Date.civil(2032,9,21), Date.civil(2049,9,21), Date.civil(2009,9,22),
Date.civil(2015,9,22), Date.civil(2026,9,22)].each do |date|
assert_equal '国民の休日', Holidays.on(date, :jp)[0][:name]
end

View file

@ -1,28 +1,29 @@
==== Regional definitions
The following definition files are included in this installation:
* holidays/nyse
* holidays/no
* holidays/es
* holidays/ie
* holidays/united_nations
* holidays/au
* holidays/mx
* holidays/za
* holidays/scandinavia
* holidays/ca
* holidays/us
* holidays/nl
* holidays/it
* holidays/de
* holidays/dk
* holidays/cz
* holidays/nz
* holidays/ups
* holidays/pt
* holidays/europe
* holidays/se
* holidays/north_america
* holidays/fr
* holidays/es
* holidays/gb
* holidays/fr
* holidays/ie
* holidays/is
* holidays/it
* holidays/jp
* holidays/nl
* holidays/mx
* holidays/no
* holidays/nz
* holidays/pt
* holidays/se
* holidays/us
* holidays/za
* holidays/united_nations
* holidays/scandinavia
* holidays/ups
* holidays/europe
* holidays/nyse
* holidays/north_america

109
lib/holidays/jp.rb Normal file
View file

@ -0,0 +1,109 @@
# encoding: utf-8
module Holidays
# This file is generated by the Ruby Holiday gem.
#
# Definitions loaded: data/jp.yaml
#
# To use the definitions in this file, load them right after you load the
# Holiday gem:
#
# require 'holidays'
# require 'holidays/jp'
#
# More definitions are available at http://code.dunae.ca/holidays.
module JP # :nodoc:
DEFINED_REGIONS = [:jp]
HOLIDAYS_BY_MONTH = {
1 => [{:mday => 1, :name => "元日", :regions => [:jp]},
{:wday => 1, :week => 2, :name => "成人の日", :regions => [:jp]}],
2 => [{:mday => 11, :name => "建国記念日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 2, 11) }, :function_id => "jp_substitute_holiday(year, 2, 11)", :name => "振替休日", :regions => [:jp]}],
3 => [{:function => lambda { |year| Holidays.jp_vernal_equinox_day(year) }, :function_id => "jp_vernal_equinox_day(year)", :name => "春分の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(Holidays.jp_vernal_equinox_day(year)) }, :function_id => "jp_substitute_holiday(Holidays.jp_vernal_equinox_day(year))", :name => "振替休日", :regions => [:jp]}],
4 => [{:mday => 29, :name => "昭和の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 4, 29) }, :function_id => "jp_substitute_holiday(year, 4, 29)", :name => "振替休日", :regions => [:jp]}],
5 => [{:mday => 3, :name => "憲法記念日", :regions => [:jp]},
{:mday => 4, :name => "みどりの日", :regions => [:jp]},
{:mday => 5, :name => "こどもの日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 5, 3) }, :function_id => "jp_substitute_holiday(year, 5, 3)", :name => "振替休日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 5, 5) }, :function_id => "jp_substitute_holiday(year, 5, 5)", :name => "振替休日", :regions => [:jp]}],
7 => [{:wday => 1, :week => 3, :name => "海の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 7, Date.calculate_mday(year, 7, 3, 1)) }, :function_id => "jp_substitute_holiday(year, 7, Date.calculate_mday(year, 7, 3, 1))", :name => "振替休日", :regions => [:jp]}],
9 => [{:wday => 1, :week => 3, :name => "敬老の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 9, Date.calculate_mday(year, 9, 3, 1)) }, :function_id => "jp_substitute_holiday(year, 9, Date.calculate_mday(year, 9, 3, 1))", :name => "振替休日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_citizons_holiday(year) }, :function_id => "jp_citizons_holiday(year)", :name => "国民の休日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_national_culture_day(year) }, :function_id => "jp_national_culture_day(year)", :name => "秋分の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(Holidays.jp_national_culture_day(year)) }, :function_id => "jp_substitute_holiday(Holidays.jp_national_culture_day(year))", :name => "振替休日", :regions => [:jp]}],
10 => [{:wday => 1, :week => 2, :name => "体育の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 10, Date.calculate_mday(year, 10, 2, 1)) }, :function_id => "jp_substitute_holiday(year, 10, Date.calculate_mday(year, 10, 2, 1))", :name => "振替休日", :regions => [:jp]}],
11 => [{:mday => 3, :name => "文化の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 11, 3) }, :function_id => "jp_substitute_holiday(year, 11, 3)", :name => "振替休日", :regions => [:jp]},
{:mday => 23, :name => "勤労感謝の日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 11, 23) }, :function_id => "jp_substitute_holiday(year, 11, 23)", :name => "振替休日", :regions => [:jp]}],
12 => [{:mday => 23, :name => "天皇誕生日", :regions => [:jp]},
{:function => lambda { |year| Holidays.jp_substitute_holiday(year, 12, 23) }, :function_id => "jp_substitute_holiday(year, 12, 23)", :name => "振替休日", :regions => [:jp]}]
}
end
def self.jp_vernal_equinox_day(year)
day =
case year
when 1851..1899
19.8277
when 1900..1979
20.8357
when 1980..2099
20.8431
when 2100..2150
21.8510
else
raise IndexError.new("Out of range")
end
day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
day = day.floor
Date.civil(year, 3, day)
end
def self.jp_national_culture_day(year)
day =
case year
when 1851..1899
22.2588
when 1900..1979
23.2588
when 1980..2099
23.2488
when 2100..2150
24.2488
else
raise IndexError.new("Out of range")
end
day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
day = day.floor
Date.civil(year, 9, day)
end
def self.jp_citizons_holiday(year)
year < 2003 and return nil
ncd = Holidays.jp_national_culture_day(year)
if ncd.wday == 3
ncd - 1
else
nil
end
end
def self.jp_substitute_holiday(*date)
date = date[0].kind_of?(Date) ? date.first : Date.civil(*date)
date.wday == 0 ? date+1 : nil
end
end
Holidays.merge_defs(Holidays::JP::DEFINED_REGIONS, Holidays::JP::HOLIDAYS_BY_MONTH)

50
test/defs/test_defs_jp.rb Normal file
View file

@ -0,0 +1,50 @@
# encoding: utf-8
require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
# This file is generated by the Ruby Holiday gem.
#
# Definitions loaded: data/jp.yaml
class JpDefinitionTests < Test::Unit::TestCase # :nodoc:
def test_jp
{Date.civil(2008,1,1) => '元日',
Date.civil(2010,1,11) => '成人の日',
Date.civil(2008,2,11) => '建国記念日',
Date.civil(2008,4,29) => '昭和の日',
Date.civil(2008,5,3) => '憲法記念日',
Date.civil(2008,5,5) => 'こどもの日',
Date.civil(2010,7,19) => '海の日',
Date.civil(2010,9,20) => '敬老の日',
Date.civil(2010,10,11) => '体育の日',
Date.civil(2008,11,3) => '文化の日',
Date.civil(2008,11,23) => '勤労感謝の日',
Date.civil(2008,12,23) => '天皇誕生日',
Date.civil(2010,3,22) => '振替休日',
Date.civil(2008,11,24) => '振替休日',
}.each do |date, name|
assert_equal name, (Holidays.on(date, :jp, :informal)[0] || {})[:name]
end
# vernal equinox day
[Date.civil(2004,3,20), Date.civil(2005,3,20), Date.civil(2006,3,21),
Date.civil(2007,3,21), Date.civil(2008,3,20), Date.civil(2009,3,20),
Date.civil(2010,3,21)].each do |date|
assert_equal '春分の日', Holidays.on(date, :jp)[0][:name]
end
# national culture day
[Date.civil(2004,9,23), Date.civil(2005,9,23), Date.civil(2006,9,23),
Date.civil(2007,9,23), Date.civil(2008,9,23), Date.civil(2009,9,23),
Date.civil(2010,9,23), Date.civil(2011,9,23), Date.civil(2012,9,22),
Date.civil(2013,9,23)].each do |date|
assert_equal '秋分の日', Holidays.on(date, :jp)[0][:name]
end
# citizons holiday
[Date.civil(2032,9,21), Date.civil(2049,9,21), Date.civil(2009,9,22),
Date.civil(2015,9,22), Date.civil(2026,9,22)].each do |date|
assert_equal '国民の休日', Holidays.on(date, :jp)[0][:name]
end
end
end