一般的日歷庫是頂多支持1800年到2200年,但是sxtwl支持BC722到9999年之間的所有日期。
如果有需要做古人八字,祖先八字、考古日歷參考, 古代的農歷陽歷轉換 這些需要的,強烈推薦。下面是一些常用功能的介紹。
1. 安裝sxtwl庫
點擊查看代碼
pip install sxtwl
2. 公歷轉農歷
點擊查看代碼
day = sxtwl.fromSolar(2022, 2, 6)
s = "農歷:%d年%s%d月%d日" % (day.getLunarYear(), '閏' if day.isLunarLeap() else '', day.getLunarMonth(), day.getLunarDay())
print(s)
3.農歷轉公歷
點擊查看代碼
# 定義農歷日期
day = sxtwl.fromLunar(2022, 1, 6)
# 公歷的年月日
s = "公歷:%d年%d月%d日" % (day.getSolarYear(), day.getSolarMonth(), day.getSolarDay())
s
其他用法
點擊查看代碼
import sxtwl
## 一些常量文字的定義。
jqmc = ["冬至", "小寒", "大寒", "立春", "雨水", "驚蟄", "春分", "清明", "谷雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪"]
Gan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
Zhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
ShX = ["鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬"]
WeekCn = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
XiZ = ('摩羯', '水瓶', '雙魚', '白羊', '金牛', '雙子', '巨蟹', '獅子', '處女', '天秤', '天蠍', '射手')
# 從公歷年月日獲取一天的信息
day = sxtwl.fromSolar(2021, 11, 7)
# 從農歷年月日獲取一天的信息
# day = sxtwl.fromLunar(2020, 12, 1)
# 公歷的年月日
s = "公歷:%d年%d月%d日" % (day.getSolarYear(), day.getSolarMonth(), day.getSolarDay())
print(s)
# 星期幾
print(WeekCn[day.getWeek()])
# 這個月的第幾周
print('該日屬於這個月的第%d周'%(day.getWeekIndex(),))
# 星座(有bug?待修復)
print("星座:", XiZ[day.getConstellation()])
# 以春節為界的農歷(注getLunarYear如果沒有傳參,或者傳true,是以春節為界的)
s = "農歷:%d年%s%d月%d日" % (day.getLunarYear(), '閏' if day.isLunarLeap() else '', day.getLunarMonth(), day.getLunarDay())
print(s)
# 不以立春為界的農歷
s = "農歷:%d年%s%d月%d日" % (day.getLunarYear(False), '閏' if day.isLunarLeap() else '', day.getLunarMonth(), day.getLunarDay())
print(s)
# 以春節為界的天干地支
yTG = day.getYearGZ(True)
print("以春節為界的年干支", Gan[yTG.tg] + Zhi[yTG.dz])
print("以春節為界的生肖:", ShX[yTG.dz])
# 以立春為界的天干地支 (注,如果沒有傳參,或者傳false,是以立春為界的。剛好和getLunarYear相反)
yTG = day.getYearGZ()
print("以立春為界的年干支", Gan[yTG.tg] + Zhi[yTG.dz])
print("以立春為界的生肖:", ShX[yTG.dz])
#月干支
mTG = day.getMonthGZ()
print("月干支", Gan[mTG.tg] + Zhi[mTG.dz])
#日干支
dTG = day.getDayGZ()
print("日干支", Gan[dTG.tg] + Zhi[dTG.dz])
#時干支
for hour in range(24):
# 第一個參數為該天的天干,第二個參數為小時
hTG = sxtwl.getShiGz(dTG.tg, hour)
print("%d時天干地支:"%(hour), Gan[hTG.tg] + Zhi[hTG.dz])
# 當日是否有節氣
if day.hasJieQi():
print('節氣:%s'% jqmc[day.getJieQi()])
#獲取節氣的儒略日數
jd = day.getJieQiJD()
# 將儒略日數轉換成年月日時秒
t = sxtwl.JD2DD(jd )
# 注意,t.s是小數,需要四舍五入
print("節氣時間:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
else:
print("當天不是節氣日")
# 四注反查 分別傳的是年天干,月天干,日天干,時天干, 開始查詢年,結束查詢年 返回滿足條件的儒略日數
jds = sxtwl.siZhu2Year(yTG, mTG, dTG, sxtwl.GZ(5, 5), 2003, 2029);
for jd in jds:
t = sxtwl.JD2DD(jd )
print("符合條件的時間:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
# 獲取一年中的閏月
year = 2020
month = sxtwl.getRunMonth(year)
if month >= 0:
print("%d年的閏月是%d"%(year, month) )
else:
print("沒有閏月")
# 一個農歷月的天數
year = 2020 #農歷年
month = 4 #農歷月
isRun = False #是否是閏月
daynum = sxtwl.getLunarMonthNum(year, month, isRun)
print("農歷%d年%s%d月的天數:"%(year, '閏'if isRun else '', month), daynum)
#儒略日數轉公歷
jd = sxtwl.J2000
t = sxtwl.JD2DD(jd )
#公歷轉儒略日
jd = sxtwl.toJD(t)
# 獲取某天的后面幾天
num = 1 #你喜歡寫多少天 也多少天,可以寫負數,相當於往前
day = day.after(num) #獲取num天后的日信息
s = "公歷:%d年%d月%d日" % (day.getSolarYear(), day.getSolarMonth(), day.getSolarDay())
print(s)
# 同上
day = day.before(num)
s = "公歷:%d年%d月%d日" % (day.getSolarYear(), day.getSolarMonth(), day.getSolarDay())
print(s)
# 查找某日前后的節氣
while True:
# 這里可以使用after或者before,不用擔心速度,這里的計算在底層僅僅是+1這么簡單
day = day.after(1)
# hasJieQi的接口比getJieQiJD速度要快,你也可以使用getJieQiJD來判斷是否有節氣。
if day.hasJieQi():
print('節氣:%s'% jqmc[day.getJieQi()])
#獲取節氣的儒略日數, 如果說你要計算什么時間的相距多少,直接比對儒略日要方便,相信我。
jd = day.getJieQiJD()
# 將儒略日數轉換成年月日時秒
t = sxtwl.JD2DD(jd )
# 注意,t.s是小數,需要四舍五入
print("節氣時間:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
break
2022-02-06 17:25:54 星期日
本文參考:https://blog.csdn.net/lifulinghan/article/details/81484332