forked from yuangu/sxtwl_cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
179 lines (139 loc) · 6.64 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import sxtwl
## 一些常量文字的定义。
Gan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
Zhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
ShX = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
numCn = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
jqmc = ["冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏",
"小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑","白露", "秋分", "寒露", "霜降",
"立冬", "小雪", "大雪"]
ymc = [ "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" ]
rmc = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"]
XiZ = ['摩羯', '水瓶', '双鱼', '白羊', '金牛', '双子', '巨蟹', '狮子', '处女', '天秤', '天蝎', '射手']
WeekCn = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
# 从公历年月日获取一天的信息
day = sxtwl.fromSolar(2021, 11, 7)
# 从农历年月日获取一天的信息
# day = sxtwl.fromLunar(2020, 12, 1)
# 如果是想查闰月,第四个参数加一个True即可
# day = sxtwl.fromLunar(2020, 4, 1, True)
# 公历的年月日
s = "公历:%d年%d月%d日" % (day.getSolarYear(), day.getSolarMonth(), day.getSolarDay())
print(s)
# 星期几
print(WeekCn[day.getWeek()])
# 这个月的第几周
print('该日属于这个月的第%d周'%(day.getWeekIndex(),))
# 星座
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)
# 使用中文表示农历
s = "农历:%d年%s%d月%d日" % (day.getLunarYear(False), '闰' if day.isLunarLeap() else '', ymc[day.getLunarMonth() - 1], rmc[day.getLunarDay() - 1])
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])
#时干支,传24小时制的时间,默认分早晚子时
hour = 18
sTG = day.getHourGZ(hour)
print("%d时的干支"%(hour, ), Gan[sTG.tg] + Zhi[sTG.dz])
# 如果想非早晚子时,第二个参数设置成false(注意,如果使用非早晚子时,那么Day要使用第二天的,相当于23点换日)
hour = 23
sTG = day.getHourGZ(hour, False)
print("%d时的干支"%(hour, ), Gan[sTG.tg] + Zhi[sTG.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("当天不是节气日")
###==================================================================================
# 四柱反查工具方法
# 实际项目中不要这样子搞哈,因为汉字utf-8,GBK2312不同的编码。建议还是直接使用天干地支的数字索引
def getGZ(gzStr):
tg = -1
dz = -1
for i, v in enumerate(Gan):
if gzStr[0] == v:
tg = i
break
for i, v in enumerate(Zhi):
if gzStr[1] == v:
dz = i
break
return sxtwl.GZ(tg, dz)
###==================================================================================
# 四注反查 分别传的是年天干,月天干,日天干,时天干, 开始查询年,结束查询年 返回满足条件的儒略日数
jds = sxtwl.siZhu2Year(getGZ('辛丑'), getGZ('己亥'), getGZ('丙寅'), getGZ('癸巳'), 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