📄 td.c
字号:
#include <string.h>
#include <math.h>
//#include "windows.h"
#include "stdio.h"
#include "Td.h"
int FirstWeek=2;//表示1980/1/1是星期2
int FirstLunar=68;
char solar_text[24][7]=
{
"\x80\x5c\x0f\x5b\xd2\x00\x00","\x80\x59\x27\x5b\xd2\x00\x00","\x80\x7a\xcb\x66\x25\x00\x00",//"小寒","大寒","立春"
"\x80\x96\xe8\x6c\x34\x00\x00","\x80\x60\xca\x86\xf0\x00\x00","\x80\x66\x25\x52\x06\x00\x00",//"雨水","惊蛰","春分"
"\x80\x6e\x05\x66\x0e\x00\x00","\x80\x8c\x37\x96\xe8\x00\x00","\x80\x7a\xcb\x59\x0f\x00\x00",//"清明","谷雨","立夏"
"\x80\x5c\x0f\x6e\xe1\x00\x00","\x80\x82\x92\x79\xcd\x00\x00","\x80\x59\x0f\x81\xf3\x00\x00",//"小满","芒种","夏至"
"\x80\x5c\x0f\x66\x91\x00\x00","\x80\x59\x27\x66\x91\x00\x00","\x80\x7a\xcb\x79\xcb\x00\x00",//"小暑","大暑","立秋"
"\x80\x59\x04\x66\x91\x00\x00","\x80\x76\x7d\x97\x32\x00\x00","\x80\x79\xcb\x52\x06\x00\x00",//"处暑","白露","秋分"
"\x80\x5b\xd2\x97\x32\x00\x00","\x80\x97\x1c\x96\x4d\x00\x00","\x80\x7a\xcb\x51\xac\x00\x00",//"寒露","霜降","立冬"
"\x80\x5c\x0f\x96\xea\x00\x00","\x80\x59\x27\x96\xea\x00\x00","\x80\x7a\xcb\x51\xac\x00\x00"//"小雪","大雪","冬至"
};
char gold[10][3]=
{
"\x80\x75\x32","\x80\x4e\x59","\x80\x4e\x19","\x80\x4e\x01",//"甲","乙","丙","丁"
"\x80\x62\x0a","\x80\x5d\xf1","\x80\x5e\x9a","\x80\x8f\x9b",//"戊","己","庚","辛"
"\x80\x58\xec","\x80\x76\x78"//"壬","癸"
};
char land[12][2]=
{
"\x5b\x50","\x4e\x11","\x5b\xc5","\x53\x6f",//"子","丑","寅","卯"
"\x8f\xb0","\x5d\xf3","\x53\x48","\x67\x2a",//"辰","巳","午","未"
"\x75\x33","\x91\x49","\x62\x0c","\x4e\xa5"//"申","酉","戌","亥
};
short GetWeek(int ys,short ms, short ds);
int CountDays( int ys,short ms, short ds );
void GetMonthTable(TIMEDATE * base_time,int month_range,int day_range,MONTHTABLE * ThisMonth);
void GetLunarYear(int year,short month,short l_m1,char *LunarYear);
void GetTimeDate(int year,short month,short day,TIMEDATE *today);
void GetNextWeek(week_date * today, int week_range,week_date * next);
void GetNextMinute(date_time_minute * today, int minute_range, date_time_minute * next);
/*void main(void)
{
// UINT16 year;int i_month,i_day;
UINT8 day; //month,
// char l_y[20];
MONTHTABLE month;
TIMEDATE today1;
today1.year=1995;
today1.month=2;
today1.day=1;
month=GetMonthTable(today1,0,1);
today1.month++;
month=GetMonthTable(today1,1,0);
/*
printf("\nInput year:");
scanf("%d",&year);
printf("\nInput month:");
scanf("%d",&i_month);
printf("\nInput day:");
scanf("%d",&i_day);
month=i_month;
day=i_day;
GetWeek(year,month,day);
*/
// GetLunarYear(2005,2,0,0,l_y);
/* today1=GetTimeDate(1995,2,18);
today1=GetTimeDate(1995,12,5);
scanf("%d",&day);
}*/
int a;
/* 2003.11.5 wyj 检查查表越界 */
void GetTimeDate(int year,short month,short day,TIMEDATE *today)//,TIMEDATE today)
{
int index;short l_firstday,i,j,l_day,leap=0,change_day=0;
int p_year;short p_month;
short l_month;
char LunarYear[20];
//2003.10.20 wyj 加入
memset(LunarYear, 0, sizeof(LunarYear));
//memset(&today,0,sizeof(TIMEDATE));
today->year=year;
today->month=month;
today->day=day;
today->week=GetWeek(year,month,day); //计算星期几
//get lunar month of pre month
/* 2003.11.5 wyj 检查查表越界 */
if(year>=1980 && year<=2031)
{
p_year=year;
p_month=month-1;
if (p_month<1)
{
p_year--;
p_month=12;
}
if (p_year<1980)
{
l_month=11;
leap=0;
} else
{
index=(p_year-1980)*12+p_month-1;
l_month=LunarIndex[index].lmonth;
if (l_month==0)
{
l_month=1;
leap=0;
} else
{
if (LunarIndex[index-1].lmonth==l_month)
leap=1;
for (i=0;i<30;i++)
{
if ((p_year%100)==LunarIndexEx[i].year&&p_month==LunarIndexEx[i].month)
{
if (LunarIndexEx[i].lmonth==l_month)
leap=1;
else
{
leap=0;
l_month=LunarIndexEx[i].lmonth;
}
break;
}
}
}
}
//get l_month and l_day
for (i=0;i<30;i++)
{
if ((year%100)==LunarIndexEx[i].year&&month==LunarIndexEx[i].month)
{
j=i;
change_day=LunarIndexEx[i].day;
break;
}
}
index=(year-1980)*12+month-1;
l_firstday=FirstDay[index];//the first day in lunar of this month
l_day=l_firstday;
//if the first day is changeday
if (LunarIndex[index].day==1)
{
if (LunarIndex[index].lmonth==l_month)
leap=1;
else
{
l_month=LunarIndex[index].lmonth;
leap=0;
}
}
//get the l_day and l_month
for (i=2;i<=day;i++)
{
if (i==LunarIndex[index].day)
{
if (LunarIndex[index].lmonth==l_month)
leap=1;
else
{
l_month=LunarIndex[index].lmonth;
leap=0;
}
l_day=1;
}
else if (day==change_day)
{
if (LunarIndexEx[j].lmonth==l_month)
leap=1;
else
{
leap=0;
l_month=LunarIndexEx[j].lmonth;
}
} else
l_day++;
}
today->l_day=l_day;
}//end of if(year>=1980 && year<=2031)
sprintf(today->timetxt,"%4d-%2d-%2d,\n",year,month,day);
if(year>=1980 && year<=2031)
{
GetLunarYear(year,month,l_month,LunarYear);
strcpy(today->l_year,(char*)LunarYear);
strcat(today->timetxt,LunarYear);
}
memset((char *)today->holiday_txt,0,sizeof(today->holiday_txt));
memset((char *)today->holidayl_txt,0,sizeof(today->holidayl_txt));
for (i=0;i<12;i++)
{
if (Holiday[i].month==month&&Holiday[i].day==day)
strcpy(today->holiday_txt,Holiday[i].text);
}
/* 2003.11.5 wyj 检查查表越界 */
if(year>=1980 && year<=2031)
{
for (i=0;i<6;i++)
{
if (HolidayL[i].month==l_month&&HolidayL[i].day==l_day)
strcpy(today->holidayl_txt,HolidayL[i].text);
}
a=leap;
today->l_month=leap*16+l_month;
}
return ;
}
/* 2003.11.5 wyj 检查查表越界 */
void GetMonthTable(TIMEDATE* base_time,int month_range,int day_range,MONTHTABLE * ThisMonth)
{
int year=base_time->year;
int index=0;
short month=base_time->month;
short day=base_time->day;
short length=0;
int i=0;
unsigned short change_day,leap,l_m1,l_m2;
//MONTHTABLE ThisMonth;
// month change
if (month_range)
{
month+=month_range;
//the month <1 means the year must decrease 1;
if (month<1)
{
year--;
month=12;
}
//the month >12 means the year must increase 1;
else if (month>12)
{
year++;
month=1;
}
//need not change year;
else
{
switch (month)
{
case 4: case 6: case 9: case 11:
if (day>30)
day=30;
break;
case 2:
if ((year%400 ==0) || ((year%4==0)&&(year%100)))
{
if (day>29)
day=29;
} else if (day>28)
day=28;
break;
}
}//end need not change year
}//end month change
//change day
else
{
day=day+day_range;
//need change month,decrease 1
if (day<1)
{
month--;
//need change year,decreae 1
if (month<1)
{
year--;
month=12;
day=31;
}
//need not change year
else
{
switch (month)
{
case 1: case 3: case 5: case 7:
case 8: case 10:
day=31;
break;
case 4: case 6: case 9: case 11:
day=30;
break;
case 2:
if ((year%400 ==0) || ((year%4==0)&&(year%100)))
day=29;
else day=28;
break;
}
}//end need not change year
}//end month decrease 1
//the day increase
else
{
switch (month)
{
case 1: case 3: case 5: case 7:
case 8: case 10:
if (day>31)
{
month++;
day=1;
}
break;
case 4: case 6: case 9: case 11:
if (day>30)
{
month++;
day=1;
}
break;
case 2:
if ((year%400 ==0) || ((year%4==0)&&(year%100)))
{
if (day>29)
{
month++;
day=1;
}
} else
{
if (day>28)
{
month++;
day=1;
}
}
break;
case 12:
if (day>31)
{
year++;
month=1;
day=1;
}
break;
}
}
}//end change day;
//now we have the correct date to get monthtable
ThisMonth->day=day;
if (((month%2)&&(month<8))||((month>=8)&&(month%2==0)))
length=31;
else if (month!=2)
length=30;
else
{
if ((year%400 ==0) || ((year%4==0)&&(year%100)))
length=29;
else
length=28;
}
ThisMonth->year=year;
ThisMonth->month=month;
ThisMonth->lenth=length;
ThisMonth->firstday=GetWeek(year,month,1);
/* 2003.11.5 wyj 检查查表越界 */
if(year>=1980 && year<=2031)
{
index=(year-1980)*12+month-1;
ThisMonth->l_firstday=FirstDay[index];
change_day=LunarIndex[index].day;
l_m1=LunarIndex[index].lmonth;
if (l_m1==LunarIndex[index-1].lmonth)
leap=1;//this flag indicate leap month.
else
leap=0;
if (change_day==0)
ThisMonth->l_midday[0]=0;
else
ThisMonth->l_midday[0]=l_m1+leap*16+change_day*256;
for (i=0;i<30;i++)
{
if ((year%100)==LunarIndexEx[i].year&&month==LunarIndexEx[i].month)
{
change_day=LunarIndexEx[i].day;
l_m2=LunarIndexEx[i].lmonth;
if (l_m2==ThisMonth->l_midday[0]%16)
leap=1;
else
leap=0;
ThisMonth->l_midday[1]=l_m2+leap*16+change_day*256;
break;
} else
{
l_m2=0;
ThisMonth->l_midday[1]=0;
}
}
memset(ThisMonth->solar[0].solartxt,0,sizeof(ThisMonth->solar[0].solartxt));
memset(ThisMonth->solar[1].solartxt,0,sizeof(ThisMonth->solar[1].solartxt));
ThisMonth->solar[0].day=LunarIndex[index].fsday;
strcpy(ThisMonth->solar[0].solartxt,solar_text[month*2-2]);
ThisMonth->solar[1].day=LunarIndex[index].lsday;
strcpy(ThisMonth->solar[1].solartxt,solar_text[month*2-1]);
}//end of if(year>=1980 && year<=2031)
//calculate the lunar year
sprintf(ThisMonth->datetxt,"%4d-%2d-%2d",year,month,day);
// GetLunarYear(year,month,(short)l_m1,(short)l_m2,LunarYear);
// strcat(ThisMonth.datetxt,LunarYear);
//get calendar data
return ;//ThisMonth
}
void GetLunarYear(int year,short month,short l_m1,char * LunarYear)
{
int l_year=year;
int goldindex=FirstLunar/10;
int landindex=FirstLunar%10;
if (abs(month-l_m1)>4)
l_year--;
landindex=(landindex+l_year-1980)%12;
goldindex=(goldindex+l_year-1980)%10;
strncpy(LunarYear,(char *)gold[goldindex],3);
strncat(LunarYear,(char *)land[landindex],2);
strcat(LunarYear,"\x5e\x74");//年
//printf("\nThe LunarYear:%s",LunarYear);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -