📄 ctime.c
字号:
//***********************************************************************
//FILE: cime.c
//功能: 将公历日期转换为农历日期和星期
//***********************************************************************
#include"main.h"
#include"time.h"
//***********************************************************************
uchar Cyear,Cmonth,Cday;
uchar Weekday;
//***********************************************************************
uint code RunDays[12]={ //闰年本月以前天数累加表
0,31,60,91,121,152,
182,213,244,274,305,335};
//***********************************************************************
uint code PingDays[12]={ //平年本月以前天数累加表
0,31,59,90,120,151,
181,212,243,273,304,334};
//***********************************************************************
uchar code RunWeekTab[12]={ //闰年月星期表
3,6,0,3,5,1,3,6,2,4,0,2};
//***********************************************************************
uchar code PingWeekTab[12]={ //平年月星期表
4,0,0,3,5,1,3,6,2,4,0,2};
//***********************************************************************
//公历农历转换表(2000-2099)
//第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0
//对应农历第1-4 月的大小
//第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表
//示农历第13 个月大小(为1代表此月大,为0代表为小)
//第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的
//公历日期
//注:由于公历表示的范围是2000-2009,所以农历的范围是
//1999-2099,所以这里第一个数据是1999年的信息
uchar code CyearTab[101][3]={
0x09,0x2e,0x50, // 1999
0x0C,0x96,0x45, // 2000
0x4d,0x4A,0xB8, // 2001
0x0d,0x4A,0x4C, // 2002
0x0d,0xA5,0x41, // 2003
0x25,0xAA,0xB6, // 2004
0x05,0x6A,0x49, // 2005
0x7A,0xAd,0xBd, // 2006
0x02,0x5d,0x52, // 2007
0x09,0x2d,0x47, // 2008
0x5C,0x95,0xBA, // 2009
0x0A,0x95,0x4e, // 2010
0x0B,0x4A,0x43, // 2011
0x4B,0x55,0x37, // 2012
0x0A,0xd5,0x4A, // 2013
0x95,0x5A,0xBf, // 2014
0x04,0xBA,0x53, // 2015
0x0A,0x5B,0x48, // 2016
0x65,0x2B,0xBC, // 2017
0x05,0x2B,0x50, // 2018
0x0A,0x93,0x45, // 2019
0x47,0x4A,0xB9, // 2020
0x06,0xAA,0x4C, // 2021
0x0A,0xd5,0x41, // 2022
0x24,0xdA,0xB6, // 2023
0x04,0xB6,0x4A, // 2024
0x69,0x57,0x3d, // 2025
0x0A,0x4e,0x51, // 2026
0x0d,0x26,0x46, // 2027
0x5e,0x93,0x3A, // 2028
0x0d,0x53,0x4d, // 2029
0x05,0xAA,0x43, // 2030
0x36,0xB5,0x37, // 2031
0x09,0x6d,0x4B, // 2032
0xB4,0xAe,0xBf, // 2033
0x04,0xAd,0x53, // 2034
0x0A,0x4d,0x48, // 2035
0x6d,0x25,0xBC, // 2036
0x0d,0x25,0x4f, // 2037
0x0d,0x52,0x44, // 2038
0x5d,0xAA,0x38, // 2039
0x0B,0x5A,0x4C, // 2040
0x05,0x6d,0x41, // 2041
0x24,0xAd,0xB6, // 2042
0x04,0x9B,0x4A, // 2043
0x7A,0x4B,0xBe, // 2044
0x0A,0x4B,0x51, // 2045
0x0A,0xA5,0x46, // 2046
0x5B,0x52,0xBA, // 2047
0x06,0xd2,0x4e, // 2048
0x0A,0xdA,0x42, // 2049
0x35,0x5B,0x37, // 2050
0x09,0x37,0x4B, // 2051
0x84,0x97,0xC1, // 2052
0x04,0x97,0x53, // 2053
0x06,0x4B,0x48, // 2054
0x66,0xA5,0x3C, // 2055
0x0e,0xA5,0x4f, // 2056
0x06,0xB2,0x44, // 2057
0x4A,0xB6,0x38, // 2058
0x0A,0xAe,0x4C, // 2059
0x09,0x2e,0x42, // 2060
0x3C,0x97,0x35, // 2061
0x0C,0x96,0x49, // 2062
0x7d,0x4A,0xBd, // 2063
0x0d,0x4A,0x51, // 2064
0x0d,0xA5,0x45, // 2065
0x55,0xAA,0xBA, // 2066
0x05,0x6A,0x4e, // 2067
0x0A,0x6d,0x43, // 2068
0x45,0x2e,0xB7, // 2069
0x05,0x2d,0x4B, // 2070
0x8A,0x95,0xBf, // 2071
0x0A,0x95,0x53, // 2072
0x0B,0x4A,0x47, // 2073
0x6B,0x55,0x3B, // 2074
0x0A,0xd5,0x4f, // 2075
0x05,0x5A,0x45, // 2076
0x4A,0x5d,0x38, // 2077
0x0A,0x5B,0x4C, // 2078
0x05,0x2B,0x42, // 2079
0x3A,0x93,0xB6, // 2080
0x06,0x93,0x49, // 2081
0x77,0x29,0xBd, // 2082
0x06,0xAA,0x51, // 2083
0x0A,0xd5,0x46, // 2084
0x54,0xdA,0xBA, // 2085
0x04,0xB6,0x4e, // 2086
0x0A,0x57,0x43, // 2087
0x45,0x27,0x38, // 2088
0x0d,0x26,0x4A, // 2089
0x8e,0x93,0x3e, // 2090
0x0d,0x52,0x52, // 2091
0x0d,0xAA,0x47, // 2092
0x66,0xB5,0x3B, // 2093
0x05,0x6d,0x4f, // 2094
0x04,0xAe,0x45, // 2095
0x4A,0x4e,0xB9, // 2096
0x0A,0x4d,0x4C, // 2097
0x0d,0x15,0x41, // 2098
0x2d,0x92,0xB5}; // 2099
//***********************************************************************
void DayBeforeNewYear(uint xdays) //公历日在春节日前的处理
{
bit runmonth; //闰月标志
uchar buf1,buf2,buf3;
if(Year==0) //如果当前是2000年
Cyear=99; //则把农历置为1999年
else
Cyear=Year-1; //否则农历年比公历少一天
Cmonth=12; //农历月=12月
runmonth=0; //闰月标志设为0
buf1=CyearTab[Year][0]; //读取闰月状态
buf1&=0xf0; //取高位闰月信息
buf1>>=4; //取得闰月
buf2=CyearTab[Year][1]; //读后8个月的大小月信息
if(buf1!=0) //如果有闰月
{
buf3=CyearTab[Year][2]; //读取第三个字节
buf2<<=1;
if((buf3&0x80)!=0)
buf2|=0x01; //将第13个月的信息加到buf2的最低位
buf3=((buf2&0x01)==0)?29:30; //取12月的天数
while(xdays>buf3) //如果xdays大于此月的天数
{
xdays=xdays-buf3; //则减去此月的天数
if(runmonth!=1) //如果当前不是闰月
Cmonth--; //则将月减1
if(Cmonth==buf1) //如果此月是闰月,则将标志取反
runmonth=!runmonth;
buf2>>=1; //将下个月的大小月信息移到bit0
buf3=((buf2&0x01)==0)?29:30;//取得需处理的月的天数
}
}
else //今年没有闰月
{
buf3=((buf2&0x01)==0)?29:30; //取12月的天数
while(xdays>buf3) //如果xdays>本月天数
{
xdays=xdays-buf3; //减去本月天数
Cmonth--; //农历月减一
buf2>>=1; //取下一个月的状态
buf3=((buf2&0x01)==0)?29:30;//取下个月的天数
}
}
Cday=buf3-(uchar)xdays+1; //计算农历日
}
//***********************************************************************
void DayAfterNewYear(uint xdays) //公历日在春节后的处理
{
bit runmonth; //闰月标志
uchar buf1,buf2,buf3;
uint buf4;
Cyear=Year; //农历年=公历年
Cmonth=1; //农历月=1月
runmonth=0; //闰月标志设为0,1月不会是闰月
buf1=CyearTab[Year+1][0]; //读取闰月状态
buf3=CyearTab[Year+1][1]; //读取5到12月的月信息
buf2=buf1&0x0f;
buf2<<=4;
buf2+=(buf3>>4);
buf3<<=4; //将12个月的信息存
buf4=((uint)buf2)*256+buf3; //于一个整型数据方便处理
buf1&=0xf0; //取高位闰月信息
buf1>>=4; //取得闰月
if(buf1!=0) //如果有闰月
{
buf2=CyearTab[Year+1][2]; //读取第三个字节
if((buf2&0x80)!=0)
buf4|=0x08; //将第13个月的信息加到整型buf4中
buf2=((buf4&0x8000)==0)?29:30; //取1月的天数
while(xdays>=buf2) //如果xdays大于此月的天数
{
xdays=xdays-buf2; //则减去此月的天数
if(runmonth!=1) //如果当前不是闰月
Cmonth++; //则将月加1
if(Cmonth==buf1) //如果此月是闰月,则将标志取反
runmonth=!runmonth;
buf4<<=1; //将下个月的大小月信息移到bit0
buf2=((buf4&0x8000)==0)?29:30;//取得需处理的月的天数
}
}
else //如果没有闰月
{
buf2=((buf4&0x8000)==0)?29:30; //取得1月的信息
while(xdays>=buf2) //如果xdays大于等于此月田鼠
{
xdays=xdays-buf2; //xdays-=本月天数
Cmonth++; //月加1
buf4<<=1; //取下一个月信息
buf2=((buf4&0x8000)==0)?29:30;//取下一个月的天数
}
}
Cday=(uchar)xdays+1; //求得农历日
}
//***********************************************************************
void ConvertDate() //公历转农历函数
{
uchar buf1,buf2;
uint buf3,buf4; //下面取得此年的农历春节信息
buf1=CyearTab[Year+1][2]; //注意YEAR+1,由于开始从1999年
buf1&=0x7f;
buf2=buf1/32; //春节对应公历日
buf1=buf1%32; //春节对应公历月
if((Year&0x03)==0) //如果是闰年,对应闰年表
{
buf4=RunDays[Month-1]+Day-1; //则取得此月以前过了多少天
buf3=RunDays[buf2-1]+buf1-1; //春节月以前过了多少天
}
else
{
buf4=PingDays[Month-1]+Day-1; //同上,但是对应平年表
buf3=PingDays[buf2-1]+buf1-1;
}
if(Month<buf2)
DayBeforeNewYear(buf3-buf4); //公历日在春节前,调用对应函数
else if(Month==buf2&&Day<buf1)
DayBeforeNewYear(buf1-Day);
else //公历日在春节后,调用对应函数
DayAfterNewYear(buf4-buf3);
}
//***********************************************************************
void GetWeek() //公历日转星期函数
{
uchar buf;
if((Year&0x03)==0)
buf=RunWeekTab[Month-1]; //取闰年星期表
else
buf=PingWeekTab[Month-1]; //取平年星期表
Weekday=(Year+Year/4+buf+Day+2)%7; //计算星期
}
//********************************END************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -