春分の日と秋分の日を求めるプログラムをJavaで作ってみた。

 春分の日秋分の日を求めるプログラムをJavaで作ってみました。(^_^;
 というか、質問の【超簡単クイズ】で、昔、Cで自作したのを思い出して、参考URLの計算式で検算してみました。(^_^;

● Equinox1.java

/* 
 * Equinox1.java
 */

class Equinox1 {
    // 春分の日(3月xx日) Vernal Equinox Day
    static int v_equinox(int year) {
        if(year< 1851 || 2150< year) return(0); // Domain Error
        int r=0, y=year-1800;
        if(y%4>=y/32%4) r++;
        if(100<=y && y< 127 || y==321) r++;
        if(y==94 || 256<=y && y< 300 && y!=288) r--;
        return(20+r);
    }

    // 秋分の日(9月xx日) Autumnal Equinox Day
    static int a_equinox(int year) {
        if(year< 1851 || 2150< year) return(0); // Domain Error
        int r=0, y=year-1852;
        if(year%4< y/32%4) r--;
        if(48<=y && y< 128 || 248<=y && y< 256) r++;
        if(y==-1 || y==32 || y==65) r++;
        return(23+r);
    }
    
    // 春分の日の計算式(3月XX日)検算用
    static int VED(int year) {
        if      (1851<=year && year<=1899)
            return (int)(19.8277+0.242194*(year-1980)-(int)((year-1983)/4));
        else if (1900<=year && year<=1979)
            return (int)(20.8357+0.242194*(year-1980)-(int)((year-1983)/4));
        else if (1980<=year && year<=2099)
            return (int)(20.8431+0.242194*(year-1980)-(int)((year-1980)/4));
        else if (2100<=year && year<=2150)
            return (int)(21.851 +0.242194*(year-1980)-(int)((year-1980)/4));
        return 0;
    }
    
    // 秋分の日の計算式(9月XX日)検算用
    static int AED(int year) {
        if      (1851<=year && year<=1899)
            return (int)(22.2588+0.242194*(year-1980)-(int)((year-1983)/4));
        else if (1900<=year && year<=1979)
            return (int)(23.2588+0.242194*(year-1980)-(int)((year-1983)/4));
        else if (1980<=year && year<=2099)
            return (int)(23.2488+0.242194*(year-1980)-(int)((year-1980)/4));
        else if (2100<=year && year<=2150)
            return (int)(24.2488+0.242194*(year-1980)-(int)((year-1980)/4));
        return 0;
    }
    
     public static void main(String[] args){
        int  year;
        long tm=System.nanoTime();      // Timer Start
        for(year=1851; year<=2150; year++)
            System.out.print((v_equinox(year)==VED(year)) ? 'o' : 'x');
        System.out.println();
        for(year=1851; year<=2150; year++)
            System.out.print((a_equinox(year)==AED(year)) ? 'o' : 'x');
        System.out.println();
    //  for(year=1851; year<=2150; year++){
    //      System.out.printf("%4d 年の春分の日は 3 月 %2d 日, ", year, v_equinox(year));
    //      System.out.printf("秋分の日は 9 月 %2d 日\n", a_equinox(year));
    //  }
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
Runtime : 0.041 [sec]

※参考URL
春分の日・秋分の日の計算式 - Vector
指定した年の春分の日・秋分の日を返す関数。 | MS Access Scrapbook
Java による祝日判定ロジック実装の試み

理科年表 平成26年

理科年表 平成26年