Пример #1
0
    def __comp_holiday_1(self, holiday_0):
        """ 振替休日計算
            ( 「国民の祝日」が日曜日に当たるときは、
              その日後においてその日に最も近い「国民の祝日」でない日 )
            * 施行日:1973-04-12

        :param  list holiday_0: 変動の祝日の日付の曜日の一覧
        :return list          : 振替休日の一覧
        """
        holidays = []
        try:
            y_min = [h[4] for h in lcst.HOLIDAY if h[0] == 90][0]
            if holiday_0[0][0] < y_min:
                return []
            for i in range(len(holiday_0)):
                y, m, d = holiday_0[i][0:3]
                if y == 1973:
                    if m < 4 or (m == 4 and d < 12):
                        continue
                jd = ltm.gc2jd(datetime(y, m, d))
                yobi = self.__yobi(jd)
                if yobi != 0:
                    continue
                next_jd = jd + 1
                next_yobi = self.__yobi(next_jd)
                if i == len(holiday_0) - 1:
                    next_y, next_m, next_d = ltm.jd2gc(next_jd)[0:3]
                    holidays.append([next_y, next_m, next_d, 90])
                else:
                    flg_furikae = 0
                    plus_day = 1
                    while flg_furikae == 0:
                        if i + plus_day < len(holiday_0):
                            plus_y, plus_m, plus_d \
                                = holiday_0[i + plus_day][0:3]
                            gc= datetime(plus_y, plus_m, plus_d)
                            plus_jd = ltm.gc2jd(gc)
                            if next_jd == plus_jd:
                                next_jd += 1
                                next_yobi = 0 \
                                    if next_yobi == 6 else next_yobi + 1
                                plus_day += 1
                            else:
                                flg_furikae = 1
                                next_y, next_m, next_d \
                                    = ltm.jd2gc(next_jd)[0:3]
                                holidays.append(
                                    [next_y, next_m, next_d, 90]
                                )
            return holidays
        except Exception as e:
            raise
Пример #2
0
    def __comp_holiday_2(self, holiday_0):
        """ 国民の休日計算
            ( 「国民の祝日」で挟まれた「国民の祝日」でない日 )
            ( 年またぎは考慮していない(今のところ不要) )
            * 施行日:1985-12-27

        :param  list holiday_0: 変動の祝日の日付・曜日の一覧
        :return list          : 国民の休日の一覧
        """
        holidays = []
        try:
            y_min = [h[4] for h in lcst.HOLIDAY if h[0] == 91][0]
            if holiday_0[0][0] < y_min:
                return []
            for i in range(len(holiday_0) - 1):
                y_0, m_0, d_0 = holiday_0[i    ][0:3]
                y_1, m_1, d_1 = holiday_0[i + 1][0:3]
                jd_0 = ltm.gc2jd(datetime(y_0, m_0, d_0))
                jd_1 = ltm.gc2jd(datetime(y_1, m_1, d_1))
                if jd_0 + 2 == jd_1:
                    jd = jd_0 + 1
                    yobi = self.__yobi(jd)
                    y, m, d = ltm.jd2gc(jd)[0:3]
                    holidays.append([y, m, d, 91])
            return holidays
        except Exception as e:
            raise
Пример #3
0
    def __comp_oc(self, jst):
        """ 旧暦計算
            * 旧暦一日の六曜
                1・7月   : 先勝
                2・8月   : 友引
                3・9月   : 先負
                4・10月 : 仏滅
                5・11月 : 大安
                6・12月 : 赤口
              と決まっていて、あとは月末まで順番通り。
              よって、月と日をたした数を6で割った余りによって六曜を決定することができます。
              ( 旧暦の月 + 旧暦の日 ) ÷ 6 = ? … 余り
              余り 0 : 大安
                   1 : 赤口
                   2 : 先勝
                   3 : 友引
                   4 : 先負
                   5 : 仏滅

        :param  datetime jst: JST(日本標準時)
        :return list        : [旧暦年, 閏月Flag, 旧暦月, 旧暦日, 六曜]
        """
        chu, saku = [], []  # jd(UTC)
        m = [[0 for _ in range(3)] for _ in range(5)]
        oc = [0 for _ in range(5)]
        try:
            jd = self.jd_jst if jst == self.jst else ltm.gc2jd(jst)
            jd -= .5
            # 計算対象の直前にあたる二分二至の時刻を計算
            res = self.__get_last_nc(jst - timedelta(hours=9))
            chu.append([ltm.gc2jd(res[0]) - .375, res[1]])
            # 中気の時刻を計算 ( 3回計算する )
            for i in range(1, 4):
                dt  = datetime(*ltm.jd2gc(chu[i - 1][0] + 32))
                dt -= timedelta(hours=9)
                res = self.__get_last_nc(dt, 30)
                chu.append([ltm.gc2jd(res[0]) - .375, res[1]])
            # 計算対象の直前にあたる二分二至の直前の朔の時刻を求める
            saku.append(
                ltm.gc2jd(
                    self.__get_last_saku(datetime(*ltm.jd2gc(chu[0][0]))) \
                  - timedelta(hours=9)
                ) - 0.125
            )
            # 朔の時刻を求める
            for i in range(1, 5):
                dt  = datetime(*ltm.jd2gc(saku[i - 1] + 30 - .375))
                saku.append(
                    ltm.gc2jd(self.__get_last_saku(dt)) - .5
                )
                # 前と同じ時刻を計算した場合( 両者の差が26日以内 )には、初期値を
                # +33日にして再実行させる。
                if abs(int(saku[i - 1]) - int(saku[i])) <= 26:
                    dt  = datetime(*ltm.jd2gc(saku[i - 1] + 35 - .375))
                    saku[i] = ltm.gc2jd(self.__get_last_saku(dt)) - .5
            # saku[1]が二分二至の時刻以前になってしまった場合には、朔をさかのぼり過ぎ
            # たと考えて、朔の時刻を繰り下げて修正する。
            # その際、計算もれ(saku[4])になっている部分を補うため、朔の時刻を計算
            # する。(近日点通過の近辺で朔があると起こる事があるようだ...?)
            if int(saku[1]) <= int(chu[0][0]):
                saku.pop(0)
                s = self.__get_last_saku(datetime(*ltm.jd2gc(saku[3] + 35)))
                saku.append(ltm.gc2jd(s))
            # saku[0]が二分二至の時刻以後になってしまった場合には、朔をさかのぼり足
            # りないと見て、朔の時刻を繰り上げて修正する。
            # その際、計算もれ(saku[0])になっている部分を補うため、朔の時刻を計算
            # する。(春分点の近辺で朔があると起こる事があるようだ...?)
            elif int(saku[0]) > int(chu[0][0]):
                saku.pop(-1)
                s = self.__get_last_saku(datetime(*ltm.jd2gc(saku[0] + 27)))
                saku.insert(0, ltm.gc2jd(s))
            # 閏月検索Flagセット
            # (節月で4ヶ月の間に朔が5回あると、閏月がある可能性がある。)
            # leap=0:平月  leap=1:閏月
            leap = 0
            if int(saku[4]) <= int(chu[3][0]):
                leap = 1
            # 朔日行列の作成
            # m[i][0] ... 月名 ( 1:正月 2:2月 3:3月 .... )
            # m[i][1] ... 閏フラグ ( 0:平月 1:閏月 )
            # m[i][2] ... 朔日のjd
            m[0][0] = (chu[0][1] // 30) + 2
            if m[0][0] > 12:
                m[0][0] -= 12
            m[0][2] = int(saku[0])
            m[0][1] = 0
            for i in range(1, 5):
                if leap == 1 and i != 1:
                    if int(chu[i - 1][0]) <= int(saku[i - 1]) or \
                       int(chu[i - 1][0]) >= int(saku[i]):
                        m[i - 1][0] = m[i - 2][0]
                        m[i - 1][1] = 1
                        m[i - 1][2] = int(saku[i - 1])
                        leap = 0
                m[i][0] = m[i - 1][0] + 1
                if m[i][0] > 12:
                    m[i][0] -= 12
                m[i][2] = int(saku[i])
                m[i][1] = 0
            # 朔日行列から旧暦を求める。
            state, index = 0, 0
            for i in range(5):
                index = i
                if int(jd) < int(m[i][2]):
                    state = 1
                    break
                elif int(jd) == int(m[i][2]):
                    state = 2
                    break
            if state == 1:
                index -= 1
            oc[1] = m[index][1]
            oc[2] = int(m[index][0])
            oc[3] = int(jd) - int(m[index][2]) + 1
            # 旧暦年の計算
            # (旧暦月が10以上でかつ新暦月より大きい場合には、
            #   まだ年を越していないはず...)
            a = ltm.jd2gc(jd)
            oc[0] = a[0]
            if oc[2] > 9 and oc[2] > a[1]:
                oc[0] -= 1
            # 六曜
            oc[4] = lcst.ROKUYO[(oc[2] + oc[3]) % 6]
            return oc
        except Exception as e:
            raise