📄 ctime.lst
字号:
138 {
139 1 bit runmonth; //闰月标志
140 1 uchar buf1,buf2,buf3;
141 1 if(Year==0) //如果当前是2000年
142 1 Cyear=99; //则把农历置为1999年
143 1 else
144 1 Cyear=Year-1; //否则农历年比公历少一天
145 1 Cmonth=12; //农历月=12月
146 1 runmonth=0; //闰月标志设为0
147 1 buf1=CyearTab[Year][0]; //读取闰月状态
148 1 buf1&=0xf0; //取高位闰月信息
149 1 buf1>>=4; //取得闰月
150 1 buf2=CyearTab[Year][1]; //读后8个月的大小月信息
151 1 if(buf1!=0) //如果有闰月
152 1 {
153 2 buf3=CyearTab[Year][2]; //读取第三个字节
154 2 buf2<<=1;
155 2 if((buf3&0x80)!=0)
156 2 buf2|=0x01; //将第13个月的信息加到buf2的最低位
157 2
158 2 buf3=((buf2&0x01)==0)?29:30; //取12月的天数
159 2 while(xdays>buf3) //如果xdays大于此月的天数
160 2 {
161 3 xdays=xdays-buf3; //则减去此月的天数
162 3 if(runmonth!=1) //如果当前不是闰月
163 3 Cmonth--; //则将月减1
164 3 if(Cmonth==buf1) //如果此月是闰月,则将标志取反
165 3 runmonth=!runmonth;
166 3 buf2>>=1; //将下个月的大小月信息移到bit0
167 3 buf3=((buf2&0x01)==0)?29:30;//取得需处理的月的天数
168 3 }
169 2 }
170 1 else //今年没有闰月
171 1 {
172 2 buf3=((buf2&0x01)==0)?29:30; //取12月的天数
173 2 while(xdays>buf3) //如果xdays>本月天数
174 2 {
175 3 xdays=xdays-buf3; //减去本月天数
176 3 Cmonth--; //农历月减一
177 3 buf2>>=1; //取下一个月的状态
178 3 buf3=((buf2&0x01)==0)?29:30;//取下个月的天数
179 3 }
C51 COMPILER V7.06 CTIME 11/09/2004 16:39:45 PAGE 4
180 2 }
181 1 Cday=buf3-(uchar)xdays+1; //计算农历日
182 1 }
183 //***********************************************************************
184 void DayAfterNewYear(uint xdays) //公历日在春节后的处理
185 {
186 1 bit runmonth; //闰月标志
187 1 uchar buf1,buf2,buf3;
188 1 uint buf4;
189 1 Cyear=Year; //农历年=公历年
190 1 Cmonth=1; //农历月=1月
191 1 runmonth=0; //闰月标志设为0,1月不会是闰月
192 1 buf1=CyearTab[Year+1][0]; //读取闰月状态
193 1 buf3=CyearTab[Year+1][1]; //读取5到12月的月信息
194 1 buf2=buf1&0x0f;
195 1 buf2<<=4;
196 1 buf2+=(buf3>>4);
197 1 buf3<<=4; //将12个月的信息存
198 1 buf4=((uint)buf2)*256+buf3; //于一个整型数据方便处理
199 1 buf1&=0xf0; //取高位闰月信息
200 1 buf1>>=4; //取得闰月
201 1 if(buf1!=0) //如果有闰月
202 1 {
203 2 buf2=CyearTab[Year+1][2]; //读取第三个字节
204 2 if((buf2&0x80)!=0)
205 2 buf4|=0x08; //将第13个月的信息加到整型buf4中
206 2 buf2=((buf4&0x8000)==0)?29:30; //取1月的天数
207 2 while(xdays>=buf2) //如果xdays大于此月的天数
208 2 {
209 3 xdays=xdays-buf2; //则减去此月的天数
210 3 if(runmonth!=1) //如果当前不是闰月
211 3 Cmonth++; //则将月加1
212 3 if(Cmonth==buf1) //如果此月是闰月,则将标志取反
213 3 runmonth=!runmonth;
214 3 buf4<<=1; //将下个月的大小月信息移到bit0
215 3 buf2=((buf4&0x8000)==0)?29:30;//取得需处理的月的天数
216 3 }
217 2 }
218 1 else //如果没有闰月
219 1 {
220 2 buf2=((buf4&0x8000)==0)?29:30; //取得1月的信息
221 2 while(xdays>=buf2) //如果xdays大于等于此月田鼠
222 2 {
223 3 xdays=xdays-buf2; //xdays-=本月天数
224 3 Cmonth++; //月加1
225 3 buf4<<=1; //取下一个月信息
226 3 buf2=((buf4&0x8000)==0)?29:30;//取下一个月的天数
227 3 }
228 2 }
229 1 Cday=(uchar)xdays+1; //求得农历日
230 1 }
231
232 //***********************************************************************
233 void ConvertDate() //公历转农历函数
234 {
235 1 uchar buf1,buf2;
236 1 uint buf3,buf4; //下面取得此年的农历春节信息
237 1 buf1=CyearTab[Year+1][2]; //注意YEAR+1,由于开始从1999年
238 1 buf1&=0x7f;
239 1 buf2=buf1/32; //春节对应公历日
240 1 buf1=buf1%32; //春节对应公历月
241 1 if((Year&0x03)==0) //如果是闰年,对应闰年表
C51 COMPILER V7.06 CTIME 11/09/2004 16:39:45 PAGE 5
242 1 {
243 2 buf4=RunDays[Month-1]+Day-1; //则取得此月以前过了多少天
244 2 buf3=RunDays[buf2-1]+buf1-1; //春节月以前过了多少天
245 2 }
246 1 else
247 1 {
248 2 buf4=PingDays[Month-1]+Day-1; //同上,但是对应平年表
249 2 buf3=PingDays[buf2-1]+buf1-1;
250 2 }
251 1 if(Month<buf2)
252 1 DayBeforeNewYear(buf3-buf4); //公历日在春节前,调用对应函数
253 1 else if(Month==buf2&&Day<buf1)
254 1 DayBeforeNewYear(buf1-Day);
255 1 else //公历日在春节后,调用对应函数
256 1 DayAfterNewYear(buf4-buf3);
257 1 }
258 //***********************************************************************
259 void GetWeek() //公历日转星期函数
260 {
261 1 uchar buf;
262 1 if((Year&0x03)==0)
263 1 buf=RunWeekTab[Month-1]; //取闰年星期表
264 1 else
265 1 buf=PingWeekTab[Month-1]; //取平年星期表
266 1 Weekday=(Year+Year/4+buf+Day+2)%7; //计算星期
267 1 }
268 //********************************END************************************
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 716 ----
CONSTANT SIZE = 375 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 8
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -