国民の祝日クラス 修正版

　こんにちは、ヨースケです。去年投稿した[国民の祝日を表示するクラス](https://qiita.com/ysk75/items/0d045cc744d372e984b1)で成人の日のように〇月の第〇月曜日という部分が間違っていたので修正版をここで載せておきます。以前はCalendarクラスのWEEK_OF_MONTHを使っていましたが、これはその日がその月の第何週目にあたるかを取得するものでした。どういうことかと言うと、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/6c78f826-b3fd-21f9-7281-c94fb640099f.png)
1月13日が成人の日です。これを判定しようとすると以前のプログラムでは

```java:machigai.java
//省略
int month, day, youbi, week;
Calendar calendar = Calendar.getInstance();

 public void holiday(){
  month = calender.get(Calendar.MONTH) + 1;
  day = calendar.get(Calendar.DAY_OF_MONTH);
  youbi = calendar.get(Calendar.DAY_OF_WEEK);
  week = calendar.get(Calendar.WEEK_OF_MONTH);

 if(month == 1 && week == 2 && youbi == 2){
   //成人の日を判定
}
//省略
```
これだと1月の2週目の月曜日は6日となります。第2月曜日は13日なのでこれだと全く使えません。なので、その日を7で割って商(整数)が1ならば、13 ÷ 7 = 1 あまり 6。これなら第2月曜日のような第〇月曜日が判断できると思います。以下は修正版の国民の祝日を判断するクラスです。

```java:Holiday.java
package third.myapp.onedaydiary;

import android.util.Log;

import java.util.Calendar;

public class Holiday {
    //今日の日付や曜日、年、週を取得
    int year,month,day,youbi,week;
    Calendar calendar = Calendar.getInstance();
    //国民の祝日を表示するか否かを判定する
    boolean holidayFlag;
    //祝日の名前や詳細、idを取得
    String holidayName,holidayDetail;
    int id;
    //振替休日を判断
    boolean transHolidayFlag;


    public void holiday(){
        year = calendar.get(Calendar.YEAR); //年
        month = calendar.get(Calendar.MONTH) + 1; //月
        day = calendar.get(Calendar.DAY_OF_MONTH); //日
        youbi = calendar.get(Calendar.DAY_OF_WEEK); //曜日
        //week = calendar.get(Calendar.WEEK_OF_MONTH); //週
        if(month == 1 && day == 1){
            //元日
            id = 1;
            holidayFlag = true;
        }
        else if(month == 1 && day / 7 == 1 && youbi == 2){
            //成人の日 第2月曜日
            id = 2;
            holidayFlag = true;
            }
        else if(month == 2 && day == 11){
            //建国記念の日
            id = 3;
            holidayFlag = true;
        }
        else if(month == 2 && day == 23){
            //天皇誕生日
            id = 4;
            holidayFlag = true;
        }
        else if(month == 3){
            //春分の日
            switch (year % 4){
                case 0:
                    //1992-2091年まで20日
                    if(year >= 1992 && year <= 2091){
                        if(day == 20){
                            id = 5;
                            holidayFlag = true;
                        }
                        else {
                            holidayFlag = false;
                        }
                    }
                    //2092-2099年までは19日
                    else{
                        if(day == 19){
                            id = 5;
                            holidayFlag = true;
                        }
                        else {
                            holidayFlag = false;
                        }
                    }
                    break;
                case 1:
                    //1992-2099年まで20日
                    if(day == 20){
                        id = 5;
                        holidayFlag = true;
                    }
                    else {
                        holidayFlag = false;
                    }
                    break;
                case 2:
                    //1992-2023年までは21日
                    if(year >= 1992 && year <= 2023){
                        if(day == 21){
                            id = 5;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    //2024-2099年まで20日
                    else{
                        if(day == 20){
                            id = 5;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    break;
                case 3:
                    //1992-2055年までは21日
                    if(year >= 1992 && year <= 2055){
                        if(day == 21){
                            id = 5;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    //2056-2099年までは20日
                    else{
                        if(day == 20){
                            id = 5;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    break;
            }
        }
        else if(month == 4 && day == 29){
            //昭和の日
            id = 6;
            holidayFlag = true;
        }
        else if(month == 5 && day == 3){
            //憲法記念日
            id = 7;
            holidayFlag = true;
        }
        else if(month == 5 && day == 4){
            //みどりの日
            id = 8;
            holidayFlag = true;
        }
        else if(month == 5 && day == 5){
            //こどもの日
            id = 9;
            holidayFlag = true;
        }
        else if(year != 2020 && month == 7 && day / 7 == 2 && youbi == 2){
            //海の日 第3月曜
            id = 10;
            holidayFlag = true;
        }
        else if(year == 2020 && month == 7 && day == 23){
            //2020年だけ海の日が移動する
            id = 10;
            holidayFlag = true;
        }
        else if(year != 2020 && month == 8 && day == 11){
            //山の日
           id = 11;
           holidayFlag = true;
        }
        else if(year == 2020 && month == 8 && day == 10){
            //2020年だけ山の日が移動する
            id = 11;
            holidayFlag = true;
        }
        else if(month == 9 && day / 7 == 2 && youbi == 2){
            //敬老の日 第3月曜
            id = 12;
            holidayFlag = true;
        }
        else if(month == 9){
            //秋分の日
            switch (year % 4){
                case 0:
                    //2012-2099年まで22日
                    if(day == 22){
                        id = 13;
                        holidayFlag = true;
                    }
                    else {
                        holidayFlag = false;
                    }
                    break;
                case 1:
                    //2012-2043年までは23日
                    if(year >= 2012 && year <= 2043){
                        if(day == 23){
                            id = 13;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    //2044-2099年までは22日
                    else{
                        if(day == 22){
                            id = 13;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    break;
                case 2:
                    //2012-2075年までは23日
                    if(year >= 2012 && year <= 2075){
                        if(day == 23){
                            id = 13;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    //2076-2099年までは22日
                    else{
                        if(day == 22){
                            id = 13;
                            holidayFlag = true;
                        }
                        else{
                            holidayFlag = false;
                        }
                    }
                    break;
                case 3:
                    //2012-2099年までは23日
                    if(day == 23){
                        id = 13;
                        holidayFlag = true;
                    }
                    else{
                        holidayFlag = false;
                    }
                    break;
            }
        }
        else if(year != 2020 && month == 10 && day / 7 == 1 && youbi == 2){
            //スポーツの日 第2月曜
            id = 14;
            holidayFlag = true;
        }
        else if(year == 2020 && month == 7 && day == 24){
            //2020年だけスポーツの日が移動する
            id = 14;
            holidayFlag = true;
        }
        else if(month == 11 && day == 3){
            //文化の日
            id = 15;
            holidayFlag = true;
        }
        else if(month == 11 && day == 23){
            //勤労感謝の日
            id = 16;
            holidayFlag = true;
        }
        else{
            holidayFlag = false;
        }
        }
        //mainに休日か否かを渡す
    public boolean getHoliday(){
        return holidayFlag;
    }
    //idをmainに渡す
    public int holiday_info(){
       return id;
    }
    //日曜に祝日があるかどうかをmainに渡す
    public boolean getTransferHoliday(){
        //祝日でその日が日曜なら
        if(holidayFlag == true && youbi == 1){
            transHolidayFlag = true;
        }
        else{
            transHolidayFlag = false;
        }
        return transHolidayFlag;
    }

    }

```

　だぶんこれで問題がないはずです。アプリを公開する前に気づけてよかった...

　ではまた。