`
rensanning
  • 浏览: 3553466 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38247
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607654
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682869
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89577
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402165
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69772
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91866
社区版块
存档分类
最新评论

日本红日子的计算

    博客分类:
  • Java
 
阅读更多
原文提供了VBA、JavaScript、C、C#、Ruby等语言的日本红日子的逻辑实现。http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm

以下是Java的实现版本:

/*
  この Java(J2SE1.4) 用祝日判定コードは、下記ウェブサイトで
  公開されているのVBA用のコードを元に、主にJavascript版と
  C言語版を参考にして
  阿蛭 栄一( ttp://www.age.ne.jp/x/abiru/index.html )が
  編集移植しました。
*/

/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
_/
_/ CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
_/ ( http://www.h3.dion.ne.jp/~sakatsu/index.htm )
_/
_/  この祝日マクロは『kt関数アドイン』で使用しているものです。
_/  このロジックは、レスポンスを第一義として、可能な限り少ない
_/ 【条件判定の実行】で結果を出せるように設計してあります。
_/  この関数では、2003年施行の改正祝日法までをサポートして
_/ います(9月の国民の休日を含む)。
_/
_/ (*1)このマクロを引用するに当たっては、必ずこのコメントも
_/   一緒に引用する事とします。
_/ (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
_/   【 http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm 】
_/   へのリンクによる紹介で対応して下さい。
_/ (*3)[ktHolidayName]という関数名そのものは、各自の環境に
_/   おける命名規則に沿って変更しても構いません。
_/ 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/


import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class KtHoliday{

    private KtHoliday(){
    }

    private static final  Calendar cstImplementTheLawOfHoliday
        = new GregorianCalendar( 1948, Calendar.JULY, 20 );       // 祝日法施行
    private static final  Calendar cstAkihitoKekkon
        = new GregorianCalendar( 1959, Calendar.APRIL, 10 );  // 明仁親王の結婚の儀
    private static final  Calendar cstShowaTaiso
        = new GregorianCalendar( 1989, Calendar.FEBRUARY, 24 );// 昭和天皇大喪の礼
    private static final  Calendar cstNorihitoKekkon
        = new GregorianCalendar( 1993, Calendar.JUNE, 9 );// 徳仁親王の結婚の儀
    private static final  Calendar cstSokuireiseiden
        = new GregorianCalendar( 1990, Calendar.NOVEMBER, 12 );// 即位礼正殿の儀
    private static final  Calendar cstImplementHoliday
        = new GregorianCalendar( 1973, Calendar.APRIL, 12 );// 振替休日施行

    // [prmDate]には "yyyy/m/d"形式の日付文字列を渡す
    public static String getHolidayName( String prmDate ) throws ParseException
    {
        String HolidayName_ret = "";
        SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy/MM/dd" );
        Calendar MyDate = Calendar.getInstance();
        MyDate.setTime( formatter.parse( prmDate ) );
        String HolidayName = prvHolidayChk( MyDate );
        if ( HolidayName == "" ) {
            if ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) {
                // 月曜以外は振替休日判定不要
                if ( MyDate.after( cstImplementHoliday ) || MyDate.equals( cstImplementHoliday ) ) {
                    Calendar YesterDay = (Calendar )MyDate.clone();
                    YesterDay.add( Calendar.DATE, -1 );
                    HolidayName = prvHolidayChk( YesterDay );
                    HolidayName_ret = "";
                    if ( HolidayName != "" ) {
                        HolidayName_ret = "振替休日";
                    } else {
                        HolidayName_ret = "";
                    }
                } else {
                    HolidayName_ret = "";
                }
            } else {
                HolidayName_ret = "";
            }
        } else {
            HolidayName_ret = HolidayName;
        }
        return HolidayName_ret;
    }

    //===============================================================

    private static String prvHolidayChk( Calendar MyDate )
    {
        int NumberOfWeek;
        String Result;
        int MyYear = MyDate.get( Calendar.YEAR );
        int MyMonth = MyDate.get( Calendar.MONTH ) + 1;    // MyMonth:1~12
        int MyDay = MyDate.get( Calendar.DATE );

        if ( MyDate.before( cstImplementTheLawOfHoliday ) ) {
        return ""; // 祝日法施行(1948/7/20 )以前
        } else;

        Result = "";
        switch ( MyMonth ) {
    // 1月 //
        case 1:
            if ( MyDay == 1 ) {
                Result = "元日";
            } else {
                if ( MyYear >= 2000 ) {
                    NumberOfWeek = ( (MyDay - 1 ) / 7 ) + 1;
                    if ( ( NumberOfWeek == 2 ) && ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) ) {
                        Result = "成人の日";
                    } else;
                } else {
                    if ( MyDay == 15 ) {
                        Result = "成人の日";
                    } else;
                }
            }
            break;
    // 2月 //
        case 2:
            if ( MyDay == 11 ) {
                if ( MyYear >= 1967 ) {
                    Result = "建国記念の日";
                } else;
            } else {
                if ( MyDate.equals( cstShowaTaiso ) ) {
                    Result = "昭和天皇の大喪の礼";
                } else;
            }
            break;
    // 3月 //
        case 3:
            if ( MyDay == prvDayOfSpringEquinox( MyYear ) ) {  // 1948~2150以外は[99]
                Result = "春分の日";                       // が返るので、必ず≠になる
            } else;
            break;
    // 4月 //
        case 4:
            if ( MyDay == 29 ) {
                if ( MyYear >= 1989 ) {
                    Result = "みどりの日";
                } else {
                Result = "天皇誕生日";
                }
            } else {
                if ( MyDate.equals( cstAkihitoKekkon ) ) {
                    Result = "皇太子明仁親王の結婚の儀";// ( =1959/4/10 )
                } else;
            }
            break;
    // 5月 //
        case 5:
            if ( MyDay == 3 ) {
                Result = "憲法記念日";
            } else {
                if ( MyDay == 4 ) {
                    if ( MyDate.get( Calendar.DAY_OF_WEEK ) > Calendar.MONDAY ) {
                    // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
                        if ( MyYear >= 1986 ) {
                            Result = "国民の休日";
                        } else;
                    } else;
                } else {
                    if ( MyDay == 5 ) {
                        Result = "子供の日";
                    } else;
                }
            }
            break;
    // 6月 //
        case 6:
            if ( MyDate.equals( cstNorihitoKekkon ) ) {
                Result = "皇太子徳仁親王の結婚の儀";
            } else;
            break;
    // 7月 //
        case 7:
            if ( MyYear >= 2003 ) {
                NumberOfWeek = ( (MyDay - 1 ) / 7 ) + 1;
                if ( ( NumberOfWeek == 3 ) && ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) ) {
                    Result = "海の日";
                } else;
            } else {
                if ( MyYear >= 1996 ) {
                    if ( MyDay == 20 ) {
                        Result = "海の日";
                    } else;
                } else;
            }
            break;
    // 9月 //
        case 9:
            //第3月曜日( 15~21 )と秋分日(22~24 )が重なる事はない
            int MyAutumnEquinox = prvDayOfAutumnEquinox( MyYear );
            if ( MyDay == MyAutumnEquinox ) {    // 1948~2150以外は[99]
                Result = "秋分の日";           // が返るので、必ず≠になる
            } else {
                if ( MyYear >= 2003 ) {
                    NumberOfWeek = ( (MyDay - 1 ) / 7 ) + 1;
                    if ( (NumberOfWeek == 3 ) && ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) ) {
                        Result = "敬老の日";
                    } else {
                        if ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.TUESDAY ) {
                            if ( MyDay == ( MyAutumnEquinox - 1 ) ) {
                                Result = "国民の休日";
                            } else;
                        } else;
                    }
                } else {
                    if ( MyYear >= 1966 ) {
                        if ( MyDay == 15 ) {
                            Result = "敬老の日";
                        } else;
                    } else;
                }
            }
            break;
    // 10月 //
        case 10:
            if ( MyYear >= 2000 ) {
                NumberOfWeek = ( ( MyDay - 1 ) / 7 ) + 1;
                if ( (NumberOfWeek == 2 ) && ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) ) {
                    Result = "体育の日";
                } else;
            } else {
                if ( MyYear >= 1966 ) {
                    if ( MyDay == 10 ) {
                        Result = "体育の日";
                    } else;
                } else;
            }
            break;
    // 11月 //
        case 11:
            if ( MyDay == 3 ) {
                Result = "文化の日";
            } else {
                if ( MyDay == 23 ) {
                    Result = "勤労感謝の日";
                } else {
                    if ( MyDate.equals( cstSokuireiseiden ) ) {
                        Result = "即位礼正殿の儀";
                    } else;
                }
            }
            break;
    // 12月 //
        case 12:
            if ( MyDay == 23 ) {
                if ( MyYear >= 1989 ) {
                    Result = "天皇誕生日";
                } else;
            } else;
            break;
        }

        return Result;
    }

    //===================================================================
    // 春分/秋分日の略算式は
    // 『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
    // で紹介されている式です。
    private static int prvDayOfSpringEquinox( int MyYear )
    {
        int SpringEquinox_ret;
        if ( MyYear <= 1947 ) {
            SpringEquinox_ret = 99;    //祝日法施行前
        } else {
            if ( MyYear <= 1979 ) {
                SpringEquinox_ret = (int)( 20.8357 + 
                ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1983 ) / 4 ) );
            } else {
                if ( MyYear <= 2099 ) {
                    SpringEquinox_ret = (int)( 20.8431 + 
                    ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1980 ) / 4 ) );
                } else {
                    if ( MyYear <= 2150 ) {
                        SpringEquinox_ret = (int)( 21.851 + 
                        ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1980 ) / 4 ) );
                    } else {
                        SpringEquinox_ret = 99;    //2151年以降は略算式が無いので不明
                    }
                }
            }
        }
        return SpringEquinox_ret;
    }

    //=====================================================================
    private static int prvDayOfAutumnEquinox( int MyYear )
    {
        int AutumnEquinox_ret;
        if ( MyYear <= 1947 ) {
            AutumnEquinox_ret = 99; //祝日法施行前
        } else {
            if ( MyYear <= 1979 ) {
                AutumnEquinox_ret = (int)( 23.2588 + 
                ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1983 ) / 4 ) );
            } else {
                if ( MyYear <= 2099 ) {
                    AutumnEquinox_ret = (int)( 23.2488 + 
                    ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1980 ) / 4 ) );
                } else {
                    if ( MyYear <= 2150 ) {
                        AutumnEquinox_ret = (int)( 24.2488 + 
                        ( 0.242194 * ( MyYear - 1980 ) ) - (int)( (MyYear - 1980 ) / 4 ) );
                    } else {
                        AutumnEquinox_ret = 99;    //2151年以降は略算式が無いので不明
                    }
                }
            }
        }
        return AutumnEquinox_ret;
    }


    /*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
    _/ 
    _/ ここから先は、阿蛭栄一が独自に追加したコーディングです。
    _/ Thu, 18 Dec 2003 02:25:27 +0900
    _/ abiru@home.104.net
    _/ 
    _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

    //=====================================================================

    /*このメソッドは、引数にjava.util.Calendarを取るgetHolidayNameメソッドです。
        単にCalendarオブジェクトから"yyyy/MM/dd"形式の文字列を組み立てて
        getHolidayName( String prmDate )の方のメソッドを呼び出しているだけですが、
        他のアプリケーションからこのクラスを使う時のことを考慮するとString
        ではなく、Calendarを引数に取るメソッドがあった方が便利ですよね?*/
    public static String getHolidayName( Calendar prmDate ) throws ParseException
    {
        SimpleDateFormat f = new SimpleDateFormat ( "yyyy/MM/dd" );
        return getHolidayName( f.format( prmDate.getTime() ) );
    }

    //=====================================================================

    /*このメソッドは動作確認やデバッグ用に用意したメソッドです。
        通常は利用しませんので不要な場合には削除して頂いて結構です。
        使い方は以下の通りです。
        java KtHoliday 1948/01/01 2050/12/30
    */
    public static void main( String args[] ) throws Exception
    {
        SimpleDateFormat f = new SimpleDateFormat ( "yyyy/MM/dd" );
        Calendar current = new GregorianCalendar();
        current.setTime( f.parse( args[0] ) );
        Calendar end = new GregorianCalendar();
        end.setTime( f.parse( args[1] ) );

        String result = "";
        while( current.before( end ) || current.equals( end ) ){
            result = getHolidayName( current );
            if( !result.equals( "" ) ){
                System.out.print( f.format( current.getTime() ) );
                System.out.println( ",\"" + result + "\"" );
            }
            current.add( Calendar.DATE , 1 );
        }

    }
}
分享到:
评论

相关推荐

    很好用的日本日历软件 日语 日本红日子 休息日等 很好用

    描述中的内容与标题相呼应,再次强调了软件的易用性和其针对日本红日子(公众假期)和休息日的实用性。 在了解这款日历软件之前,我们需要知道一些基础概念: 1. **日语支持**:对于日本用户来说,软件提供日语...

    日本第五代计算机日本第五代计算机

    总的来说,日本第五代计算机是计算机历史上一个重要的里程碑,它标志着计算机技术从单纯的数值计算向智能化、人性化方向转变的开始。虽然在商业市场上并未取得预期的成功,但其在技术上的探索和创新,对后续计算机...

    日本齿轮计算界面

    日本的齿轮计算软的页面,想做该种软件时借借一下,如涉及到侵权,请联系删除, 不得用于任何商业胖用途

    日本计算机专业概况及就业前景分析.zip

    《日本计算机专业概况及就业前景分析》 日本作为全球科技领域的先进国家,其计算机专业教育与产业发展具有极高的水平和深远影响。这篇文章将深入探讨日本的计算机专业教育现状,以及毕业生在就业市场上的前景。 一...

    日本计算机专业计算机专业发展、危机与对策站在普通.doc

    日本计算机专业计算机专业发展、危机与对策站在普通.doc

    日本地图(清晰版)【甄选文档】.pdf

    日本地图资源概览 japan国地图概览: 日本国地图是指日本国内的地图,展示了日本的疆域、行政区划、地形、交通网络等信息。根据地图的类型不同,可以分为政治地图、交通地图、旅游地图、历史地图等。在日本,地图...

    matlab开发-如何将图像处理和计算机视觉应用于2013年日本和日本

    例如,如果是在监测自然灾害(如地震、台风)的项目中,摄像头可以捕捉现场图像,通过物联网设备发送到计算平台,MATLAB程序则负责处理这些图像,快速识别出潜在的危险信号。 此外,文件"license.txt"可能是MATLAB...

    日本政区划地图.zip

    日本的行政区划是其国家行政组织结构的一种划分方式,它涉及到日本全国的各个地区,包括都、道、府、县以及市、町、村等不同级别的行政单位。在这个"日本政区划地图.zip"压缩包中,我们主要关注的是日本的地理与行政...

    日本地图数据

    标题中的“日本地图数据”指的是一个包含日本地理信息的数据集,这个数据集涵盖了日本全国47个都道府县的详细地图信息。这样的数据通常用于地理信息系统(GIS)或者数据分析,以便于绘制热力图或其他可视化表现形式...

    2.5模数以下小螺伞计算

    2.5模数以下小螺伞计算,包括刀具计算。

    计算机学报LaTeX模板2020

    它由中国计算机学会与中国科学院计算技术研究所主办、科学出版社出版,以中文编辑形式与读者见面,同时以英文摘要形式向国际各大检索系统提供基本内容介绍。《计算机学报》始创于1978年,刊期为月刊。 《计算机学报...

    日本历液面计与叶片生物量计算

    日本历液面计与叶片生物量甲酸方面的研究方法与计算的初步研究,方法值得借鉴

    js日历 日文 日本版本+html

    5. **日本**:由于这个组件是针对日本市场的,因此可能需要适应日本的日期格式和节假日。 【压缩包子文件的文件名称列表】: 1. **html.html**:这可能是包含日历组件HTML结构的文件,其中可能包含了日历的容器元素...

    日本最著名操作系统日本最著名操作系统

    MachBSD 结合了BSD的易用性和Mach的高性能,尤其在并行计算和实时系统方面表现出色。 3. **Red Hat Enterprise Linux (RHEL)** 虽然RHEL并非日本原创,但其在日本有着广泛的用户基础和社区支持。RHEL是一款企业级...

    日本经济发展史.pdf

    "日本经济发展史" 日本经济发展史可以分为两个阶段:从明治维新到二战结束,和战后经济复兴。 从明治维新到二战结束(1868-1945年) 在明治维新后,日本建立了强有力的中央集权国家,开始将赶超西方强国、推进...

    齿轮公法线计算

    齿轮公法线计算用表格,简洁快速,计算各种标准及非标齿轮公法线长度

    现代日本の开化--夏目漱石.doc

    现代日本の开化--夏目漱石 夏目漱石的演讲《现代日本の开化》是对现代日本社会的观察和思考。夏目漱石通过自己的演讲,讲述了日本社会的变革和发展,表达了对日本现代化的看法和思考。 在演讲中,夏目漱石提到了...

    日本东北大学李昊课题组诚招特聘助理教授和博士后(材料计算或机器学习方向)1

    【日本东北大学李昊课题组】专注于材料设计与计算以及人工智能领域的研究,特别是材料计算和机器学习技术在材料科学中的应用。课题组由李昊副教授领导,他在2022年开始担任日本东北大学材料科学高等研究所(AIMR)的...

    日本国概况中文翻译.pdf

    日本,这个位于东亚的岛国,由四个主要岛屿——本州、北海道、四国、九州以及众多小岛构成,是一个融合了传统与现代、自然美景与高科技的国家。日本的历史悠久,文化丰富,其独特的传统艺术和习俗,如茶道、武士道和...

Global site tag (gtag.js) - Google Analytics