Skip to content

Instantly share code, notes, and snippets.

@oboenikui
Last active August 30, 2021 05:47
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oboenikui/6477743 to your computer and use it in GitHub Desktop.
Save oboenikui/6477743 to your computer and use it in GitHub Desktop.
Javaで国民の祝日とかの名前を取得するやつ(1948/7/20~2013/9/8現在)
package com.oboenikui.holiday;
import java.util.Calendar;
public class Holiday {
/**
* calで渡された日が祝日かどうかを返します。
* @param cal 判別したい日
* @return 祝日ならtrue、そうでなければfalseを返します。
*/
public static boolean isHoliday(Calendar cal){
return isNormalHoliday(cal)||isLenu(cal)||isNationalHoliday(cal);
}
/**
* 国民の祝日であればその名前を返します。もしも異なる場合は返り値はnullとなります。
* @param cal 名前を取得したい日
* @return 国民の祝日の名前
*/
public static String getHolidayName(Calendar cal){
Calendar first_day = Calendar.getInstance();
first_day.set(1948, 7, 20);
if(first_day.compareTo(cal)>=0) return null;
int year = cal.get(Calendar.YEAR);
int date = cal.get(Calendar.DAY_OF_MONTH);
switch (cal.get(Calendar.MONTH)) {
case Calendar.JANUARY:
switch (date) {
case 1:
return "元日";
case 15:
if(year<=1999) return "成人の日";
default:
if(year>=2000&&isMondayHoliday(cal,2)) return "成人の日";
}
break;
case Calendar.FEBRUARY:
if (year>=1967&&date==11) return "建国記念の日";
break;
case Calendar.MARCH:
if(isVernalEquinoxHoliday(cal)) return "春分の日";
break;
case Calendar.APRIL:
if(date==29){
if(year<=1988) return "天皇誕生日";
else if(year<=2006) return "みどりの日";
else return "昭和の日";
}
break;
case Calendar.MAY:
switch (date) {
case 3:
return "憲法記念日";
case 4:
if(year>=2007) return "みどりの日";
break;
case 5:
return "こどもの日";
default:
break;
}
break;
case Calendar.JULY:
if(year>=1996&&year<=2002&&date==20||year>=2003&&isMondayHoliday(cal, 3)) return "海の日";
break;
case Calendar.SEPTEMBER:
if(year>=1966&&year<=2002&&date==15||year>=2003&&isMondayHoliday(cal, 3)) return "敬老の日";
else if(isAutumnEquinoxHoliday(cal)) return "秋分の日";
break;
case Calendar.OCTOBER:
if(year>=1966&&year<=1999&&date==10||year>=2000&&isMondayHoliday(cal, 2)) return "体育の日";
break;
case Calendar.NOVEMBER:
switch(date){
case 3:
return "文化の日";
case 23:
return "勤労感謝の日";
default:
break;
}
break;
case Calendar.DECEMBER:
if(year>=1989&&date==23) return "天皇誕生日";
break;
default:
break;
}
if(isLenu(cal)) return "振替休日";
if(isNationalHoliday(cal)) return "国民の休日";
return null;
}
private static boolean isNormalHoliday(Calendar cal){
Calendar first_day = Calendar.getInstance();
first_day.set(1948, 7, 20);
if(first_day.compareTo(cal)>=0) return false;
int year = cal.get(Calendar.YEAR);
int day = cal.get(Calendar.DAY_OF_MONTH);
switch (cal.get(Calendar.MONTH)) {
case Calendar.JANUARY:
return day==1||(year<=1999&&day==15)||(year>=2000&&isMondayHoliday(cal,2));
case Calendar.FEBRUARY:
return year>=1967&&day==11;
case Calendar.MARCH:
return isVernalEquinoxHoliday(cal);
case Calendar.APRIL:
return day==29;
case Calendar.MAY:
return (day==3||day==5)||year>=2007&&day==4;
case Calendar.JULY:
return year>=1996&&year<=2002&&day==20||year>=2003&&isMondayHoliday(cal, 3);
case Calendar.SEPTEMBER:
return year>=1966&&year<=2002&&day==15||year>=2003&&isMondayHoliday(cal, 3)||isAutumnEquinoxHoliday(cal);
case Calendar.OCTOBER:
return year>=1966&&year<=1999&&day==10||year>=2000&&isMondayHoliday(cal, 2);
case Calendar.NOVEMBER:
return day==3||day==23;
case Calendar.DECEMBER:
return year>=1989&&day==23;
default:
return false;
}
}
private static boolean isAutumnEquinoxHoliday(Calendar cal){
int year = cal.get(Calendar.YEAR);
if(cal.get(Calendar.MONTH)!=Calendar.SEPTEMBER||year<1948) return false;
int day_of_month = cal.get(Calendar.DAY_OF_MONTH);
switch(year%4){
case 0:
return (year<=2008&&day_of_month==23)||(year>2008&&day_of_month==22);
case 1:
return (year<=2041&&day_of_month==23)||(year>2041&&day_of_month==22);
case 2:
return (year<=2074&&day_of_month==23)||(year>2074&&day_of_month==22);
case 3:
return (year<=1979&&day_of_month==24)||(year>1979&&day_of_month==23);
default:
return false;
}
}
private static boolean isVernalEquinoxHoliday(Calendar cal){
int year = cal.get(Calendar.YEAR);
if(cal.get(Calendar.MONTH)!=Calendar.MARCH||year<1949) return false;
int day_of_month = cal.get(Calendar.DAY_OF_MONTH);
switch(year%4){
case 0:
return (year<=1956&&day_of_month==21)||(year>1956&&year<=2088&&day_of_month==20)||(year>2088&&day_of_month==19);
case 1:
return (year<=1989&&day_of_month==21)||(year>1989&&day_of_month==20);
case 2:
return (year<=2022&&day_of_month==21)||(year>2022&&day_of_month==20);
case 3:
return (year<=1923&&day_of_month==22)||(year>1923&&year<=2055&&day_of_month==21)||(year>2055&&day_of_month==20);
default:
return false;
}
}
private static boolean isMondayHoliday(Calendar cal, int i){
int day = cal.get(Calendar.DAY_OF_MONTH);
return cal.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY&&day>=i*7-6&&day<=i*7;
}
private static boolean isLenu(Calendar cal){
Calendar operation = Calendar.getInstance();
operation.set(1973, 4, 12);
if(operation.compareTo(cal)>=0)return false;
Calendar cal_before = (Calendar) cal.clone();
cal_before.add(Calendar.DAY_OF_YEAR, -1);
if(cal.get(Calendar.YEAR)>=2007){
boolean lenu = true;
int i;
for(i=cal.get(Calendar.DAY_OF_WEEK);i>=1;i--){
lenu&=isNormalHoliday(cal_before);
cal_before.add(Calendar.DAY_OF_YEAR, -1);
}
return lenu;
} else {
return isNormalHoliday(cal_before)&&cal.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY;
}
}
private static boolean isNationalHoliday(Calendar cal){
Calendar operation = Calendar.getInstance();
operation.set(1985, 12, 27);
if(operation.compareTo(cal)>=0)return false;
Calendar cal_before = (Calendar) cal.clone();
Calendar cal_after = (Calendar) cal.clone();
cal_before.add(Calendar.DAY_OF_YEAR, -1);
cal_after.add(Calendar.DAY_OF_YEAR, 1);
return isNormalHoliday(cal_before)&&isNormalHoliday(cal_after);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment