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
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
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