Last active
August 30, 2021 05:47
-
-
Save oboenikui/6477743 to your computer and use it in GitHub Desktop.
Javaで国民の祝日とかの名前を取得するやつ(1948/7/20~2013/9/8現在)
This file contains hidden or 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
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