C语言求农历
1. 用c语言怎么将公历日期转化为农历日期
其实很简单,你的程序中定义一些数组,保存一些重要参数即可,下面是JAVASCRIPT的,看懂了你就可以用C来写:
var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0)
//====================================== 传回农历 y年的总天数
function lYearDays(y) {
var i, sum = 348
for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0
return(sum+leapDays(y))
}
//====================================== 传回农历 y年闰月的天数
function leapDays(y) {
if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29)
else return(0)
}
//====================================== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
function leapMonth(y) {
return(lunarInfo[y-1900] & 0xf)
}
//====================================== 传回农历 y年m月的总天数
function monthDays(y,m) {
return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )
}
2. C语言万年历
PIC16F877A LCD1602液晶式万年历
默认分类 2011-03-23 23:27:51 阅读10 评论0 字号:大中小 订阅
#include<pic.h>#define uchar unsigned char#define uint unsigned int#define RS RA1#define RW RA2#define E RA3#define s1 RB1#define s2 RB2#define s3 RB3 __CONFIG(0x1832);int Hours=0;//定义小时int Minutes=0;//定义分钟int Seconds=0;//定义秒int Day=20;int Months=03;int Years=2011;const char Table[]="0123456789"; ////1602:0-9 数字uint Y[16]; //8字节的显示缓冲区uchar set_2=0;int incone(int n);int decone(int m);void delay(uint x)///延时 { uint a,b; for(a=x;a>0;a--) for(b=30;b>0;b--); }
void interrupt time0 (){uchar temp,intnum; T0IF=0; TMR0=63; intnum++; if(intnum==40) { intnum=0; Seconds++; if(Seconds==60) { Seconds=0; Minutes++; if(Minutes==60) { Minutes=0; Hours++; if(Hours==24) { Hours=0; Day++; if(Day==31) { Day=0; Months++; if(Months==12) { Months=0; Years++; } } } } } } }
void write_Directive(uchar a)//写指令{RS=0;RW=0;delay(1);E=0;PORTD=a;delay(1);E=1;delay(1);E=0;delay(1);}
void write_Data(uchar a)//写数据{RS=1;RW=0;delay(1);E=0;PORTD=a;delay(1);E=1;delay(1);E=0;delay(1);
}void init()//初始化{ ADCON1=0X07; PORTB=0xFF; TRISB=0XFF; PORTC=0x00; TRISC=0X00; TRISD=0; TRISA=0; OPTION=0X06; TMR0=63; INTCON=0XA0;Y[14]=':';delay(15);write_Directive(0x38);delay(5);write_Directive(0x38);delay(5);write_Directive(0x38);write_Directive(0x01);write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置write_Directive(0x0c);//不显示光标}
void write_Data_String()//显示时间函数{ Y[0]=Hours/10;//转换成10进制显示Y[1]=Hours%10;Y[2]=Minutes/10;Y[3]=Minutes%10;Y[4]=Seconds/10;Y[5]=Seconds%10;Y[6]=Years/1000;Y[7]=Years/100%10;Y[8]=Years/10%10;Y[9]=Years%10;//Y[6]=Years/1000;//Y[7]=Years%1000/100;//DispBuf[8]=Years%100/10;//DispBuf[9]=Years%10;Y[10]=Months/10;Y[11]=Months%10;Y[12]=Day/10;Y[13]=Day%10;Y[14]=':';Y[15]='.';Y[0]=Table[Y[0]];//查表取字符Y[1]=Table[Y[1]];Y[2]=Table[Y[2]];Y[3]=Table[Y[3]];Y[4]=Table[Y[4]];Y[5]=Table[Y[5]];Y[6]=Table[Y[6]];//查表取字符Y[7]=Table[Y[7]];Y[8]=Table[Y[8]];Y[9]=Table[Y[9]];Y[10]=Table[Y[10]];Y[11]=Table[Y[11]];Y[12]=Table[Y[12]];Y[13]=Table[Y[13]];write_Directive(0x80+0x04);//第一行,第五个位置地址
write_Data(Y[0]);//第一行,第五个位置write_Data(Y[1]);//第一行,第六个位置
write_Data(Y[14]);//第一行,第七个位置
write_Data(Y[2]);//第一行,第八个位置write_Data(Y[3]);//第一行,第九个位置
write_Data(Y[14]);//第一行,第十个位置
write_Data(Y[4]);//第一行,第十一个位置write_Data(Y[5]);//第一行,第十二个位置
write_Directive(0x80+0x43);//第二行,第四个位置地址
write_Data(Y[6]);//第二行,第四个位置write_Data(Y[7]);//第二行,第五个位置write_Data(Y[8]);//第二行,第六个位置write_Data(Y[9]);//第二行,第七个位置
write_Data(Y[15]);//第二行,第八个位置
write_Data(Y[10]);//第二行,第九个位置write_Data(Y[11]);//第二行,第十个位置
write_Data(Y[15]);//第二行,第十一个位置
write_Data(Y[12]);//第二行,第十二个位置write_Data(Y[13]);//第二行,第十三个位置}void key_set() //时间按键设置{if(s1 == 0){ delay(20); if(s1 == 0) { set_2++; while(!s1); if(set_2 == 8) { set_2 = 0; } }}}void set_time() //设置时间函数{ if(set_2==1) { RC0=1; } if(set_2==2) ////s2即RB1按1次调秒 { Seconds=incone(Seconds); if(Seconds>59) { Seconds=0; } Seconds=decone(Seconds); if(Seconds<0) { Seconds=59; } } if(set_2==3) ////s2即RB1按2次调分 { Minutes=incone(Minutes); if(Minutes>59) { Minutes=0; } Minutes=decone(Minutes); if(Minutes<0) { Minutes=59; } } if(set_2==4) ////s2即RB1按3次调时 { Hours=incone(Hours); if(Hours>23) { Hours=0; } Hours=decone(Hours); if(Hours<0) { Hours=23; } } if(set_2==5) ////s2即RB1按4次调天 { Day=incone(Day); if(Day>31) { Day=1; } Day=decone(Day); if(Day<1) { Day=31; } } if(set_2==6) ////s2即RB1按4次调月 { Months=incone(Months); if(Months>12) { Months=1; } Months=decone(Months); if(Months<1) { Months=12; } } if(set_2==7) ////s2即RB1按5次调年 { Years=incone(Years); if(Years>2050) { Years=1986; } Years=decone(Years); if(Years<1986) { Years=2010; } } }
int incone(int n) //加“1”函数{ if(s2==0) { delay(20); if(s2==0) { n++; while(!s2); write_Data_String(); } }}
int decone(int m) //减“1”函数{ if(s3==0) { delay(20); if(s3==0) { m--; while(!s3); write_Data_String(); } }}void main(){init();while(1) { key_set(); set_time(); write_Data_String(); }}
Dim WeekName(7), MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXiang(11), DayName(30), MonName(12)
Dim curTime, curYear, curMonth, curDay, curWeekday
Dim GongliStr, WeekdayStr, NongliStr, NongliDayStr
Dim i, m, n, k, isEnd, bit, TheDate
Private Sub Form_Load()
'获取当前系统时间
curTime = Now()
'星期名
WeekName(0) = " * "
WeekName(1) = "星期日"
WeekName(2) = "星期一"
WeekName(3) = "星期二"
WeekName(4) = "星期三"
WeekName(5) = "星期四"
WeekName(6) = "星期五"
WeekName(7) = "星期六"
'天干名称
TianGan(0) = "甲"
TianGan(1) = "乙"
TianGan(2) = "丙"
TianGan(3) = "丁"
TianGan(4) = "戊"
TianGan(5) = "己"
TianGan(6) = "庚"
TianGan(7) = "辛"
TianGan(8) = "壬"
TianGan(9) = "癸"
'地支名称
DiZhi(0) = "子"
DiZhi(1) = "丑"
DiZhi(2) = "寅"
DiZhi(3) = "卯"
DiZhi(4) = "辰"
DiZhi(5) = "巳"
DiZhi(6) = "午"
DiZhi(7) = "未"
DiZhi(8) = "申"
DiZhi(9) = "酉"
DiZhi(10) = "戌"
DiZhi(11) = "亥"
'属相名称
ShuXiang(0) = "鼠"
ShuXiang(1) = "牛"
ShuXiang(2) = "虎"
ShuXiang(3) = "兔"
ShuXiang(4) = "龙"
ShuXiang(5) = "蛇"
ShuXiang(6) = "马"
ShuXiang(7) = "羊"
ShuXiang(8) = "猴" ;
ShuXiang(9) = "鸡"
ShuXiang(10) = "狗"
ShuXiang(11) = "猪"
'农历日期名
DayName(0) = "*"
DayName(1) = "初一"
DayName(2) = "初二"
DayName(3) = "初三"
DayName(4) = "初四"
DayName(5) = "初五"
DayName(6) = "初六"
DayName(7) = "初七"
DayName(8) = "初八"
DayName(9) = "初九"
DayName(10) = "初十"
DayName(11) = "十?quot;"
DayName(12) = "十二"
DayName(13) = "十三"
DayName(14) = "十四"
DayName(15) = "十五"
DayName(16) = "十六"
DayName(17) = "十七"
DayName(18) = "十八"
DayName(19) = "十九"
DayName(20) = "二十"
DayName(21) = "廿一"
DayName(22) = "廿二"
DayName(23) = "廿三"
DayName(24) = "廿四"
DayName(25) = "廿五"
DayName(26) = "廿六"
DayName(27) = "廿七"
DayName(28) = "廿八"
DayName(29) = "廿九"
DayName(30) = "三十"
'农历月份名
MonName(0) = "*"
MonName(1) = "正"
MonName(2) = "二"
MonName(3) = "三"
MonName(4) = "四"
MonName(5) = "五"
MonName(6) = "六"
MonName(7) = "七"
MonName(8) = "八"
MonName(9) = "九"
MonName(10) = "十"
MonName(11) = "十一"
MonName(12) = "腊"
'公历每月前面的天数
MonthAdd(0) = 0
MonthAdd(1) = 31
MonthAdd(2) = 59
MonthAdd(3) = 90
MonthAdd(4) = 120
MonthAdd(5) = 151
MonthAdd(6) = 181
MonthAdd(7) = 212
MonthAdd(8) = 243
MonthAdd(9) = 273
MonthAdd(10) = 304
MonthAdd(11) = 334
'农历数据
NongliData(0) = 2635
NongliData(1) = 333387
NongliData(2) = 1701
NongliData(3) = 1748
NongliData(4) = 267701
NongliData(5) = 694
NongliData(6) = 2391
NongliData(7) = 133423
NongliData(8) = 1175
NongliData(9) = 396438
NongliData(10) = 3402
NongliData(11) = 3749
NongliData(12) = 331177
NongliData(13) = 1453
NongliData(14) = 694
NongliData(15) = 201326
NongliData(16) = 2350
NongliData(17) = 465197
NongliData(18) = 3221
NongliData(19) = 3402
NongliData(20) = 400202
NongliData(21) = 2901
NongliData(22) = 1386
NongliData(23) = 267611
NongliData(24) = 605
NongliData(25) = 2349
NongliData(26) = 137515
NongliData(27) = 2709
NongliData(28) = 464533
NongliData(29) = 1738
NongliData(30) = 2901
NongliData(31) = 330421
NongliData(32) = 1242
NongliData(33) = 2651
NongliData(34) = 199255
NongliData(35) = 1323
NongliData(36) = 529706
NongliData(37) = 3733
NongliData(38) = 1706
NongliData(39) = 398762
NongliData(40) = 2741
NongliData(41) = 1206
NongliData(42) = 267438
NongliData(43) = 2647
NongliData(44) = 1318
NongliData(45) = 204070
NongliData(46) = 3477
NongliData(47) = 46
NongliData(48) = 1386
NongliData(49) = 2413
NongliData(50) = 330077
NongliData(51) = 1197
NongliData(52) = 2637
NongliData(53) = 268877
NongliData(54) = 3365
NongliData(55) = 531109
NongliData(56) = 2900
NongliData(57) = 2922
NongliData(58) = 398042
NongliData(59) = 2395
NongliData(60) = 1179
NongliData(61) = 267415
NongliData(62) = 2635
NongliData(63) = 661067
NongliData(64) = 1701
NongliData(65) = 1748
NongliData(66) = 398772
NongliData(67) = 2742
NongliData(68) = 2391
NongliData(69) = 330031
NongliData(70) = 1175
NongliData(71) = 1611
NongliData(72) = 200010
NongliData(73) = 3749
NongliData(74) = 527717
NongliData(75) = 1452
NongliData(76) = 2742
NongliData(77) = 332397
NongliData(78) = 2350
NongliData(79) = 3222
NongliData(80) = 268949
NongliData(81) = 3402
NongliData(82) = 3493
NongliData(83) = 133973
NongliData(84) = 1386
NongliData(85) = 464219
NongliData(86) = 605
NongliData(87) = 2349
NongliData(88) = 334123
NongliData(89) = 2709
NongliData(90) = 2890
NongliData(91) = 267946
NongliData(92) = 2773
NongliData(93) = 592565
NongliData(94) = 1210
NongliData(95) = 2651
NongliData(96) = 395863
NongliData(97) = 1323
NongliData(98) = 2707
NongliData(99) = 265877
'生成当前公历年、月、日 ==> GongliStr
curYear = Year(curTime)
curMonth = Month(curTime)
curDay = Day(curTime)
GongliStr = curYear & "年"
If (curMonth < 10) Then
GongliStr = GongliStr & "0" & curMonth & "月"
Else
GongliStr = GongliStr & curMonth & "月"
End If
If (curDay < 10) Then
GongliStr = GongliStr & "0" & curDay & "日"
Else
GongliStr = GongliStr & curDay & "日"
End If
'生成当前公历星期 ==> WeekdayStr
curWeekday = Weekday(curTime)
WeekdayStr = WeekName(curWeekday)
'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(curMonth - 1) - 38
If ((curYear Mod 4) = 0 And curMonth > 2) Then
TheDate = TheDate + 1
End If
'计算农历天干、地支、月、日
isEnd = 0
m = 0
Do
If (NongliData(m) < 4095) Then
k = 11
Else
k = 12
End If
n = k
Do
If (n < 0) Then
Exit Do
End If
'获取NongliData(m)的第n个二进制位的值
bit = NongliData(m)
For i = 1 To n Step 1
bit = Int(bit / 2)
Next
bit = bit Mod 2
If (TheDate <= 29 + bit) Then
isEnd = 1
Exit Do
End If
TheDate = TheDate - 29 - bit
n = n - 1
Loop
If (isEnd = 1) Then
Exit Do
End If
m = m + 1
Loop
curYear = 1921 + m
curMonth = k - n + 1
curDay = TheDate
If (k = 12) Then
If (curMonth = (Int(NongliData(m) / 65536) + 1)) Then
curMonth = 1 - curMonth
ElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)) Then
curMonth = curMonth - 1
End If
End If
'生成农历天干、地支、属相 ==> NongliStr
NongliStr = "农历" & TianGan(((curYear - 4) Mod 60) Mod 10) & DiZhi(((curYear - 4) Mod 60) Mod 12) & "年"
NongliStr = NongliStr & "(" & ShuXiang(((curYear - 4) Mod 60) Mod 12) & ")"
'生成农历月、日 ==> NongliDayStr
If (curMonth < 1) Then
NongliDayStr = "闰" & MonName(-1 * curMonth)
Else
NongliDayStr = MonName(curMonth)
End If
NongliDayStr = NongliDayStr & "月"
NongliDayStr = NongliDayStr & DayName(curDay)
MsgBox NongliStr & NongliDayStr
End Sub
4. 万年历的c语言程序代码包括节假日农历,农历转公历,公历农历查询某
直接给你整个工程吧,实现了星期计算、公历转农历、农历转公历、节气查询。非常不错的代码,你要的年份范围可以自己决定,支持从公元1600年到公元6400年的四千八百年数据。数据经过我精心设计的原创压缩算法压缩,体积非常小,效率很高。
密码:n51c(之前的不知啥原因被HX了,原创的都会被这样,鉴于需要的朋友很多,重新更换了链接)。
如果需要开发日历的完整开发包(支持更长年份),可私信。
5. 带农历的日历 c语言程序
有算法,可以将阳历的年、月、日转成对应的农历的
~~~~~~~~~~~
6. 谁有将阳历转换成阴历的C语言程序代码啊
我刚好有资源,这是我原创的程序,里面的数据压缩方式、转换、参考点等,都是自行设计的,能够准确地将公历转农历,将农历转公历,同时还提供一个自行设计的农历库,附带例程,还有农历信息提取工具,可以自定义年份区间(1600-7000)。
7. 怎么用C语言编写编写万年历
农历,大月30天,小月29天。
还有闰月。这个有点麻烦。我不知道农历的润月是怎么个润法。
农历
[解释]1.中国的一种历法,是阴阳历的一种,一般就叫阴历。平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪一月大,哪一月小,年年不同)。由于平均每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天。又根据太阳的位置,把一个太阳年分成二十四个节气,便于农事。纪年用天干地支搭配,六十年周而复始。这种历法相传创始于夏代,所以又称为夏历。也叫旧历。
2.农业上使用的历书。
即夏历。(“农历”一称流行的原因:由于文化大革命时期极左思潮泛滥,“横扫四旧”,认为“夏历”是夏王朝的印记,必须改名;因传统历法在农村使用较普遍,故通过报纸改名“农历”:1968年元旦,全国报纸报头一夜间将“夏历”名称改成了“农历”。
按:所谓“农历”,是指它有指导农业生产的意义,但事实上农历月日与季节变化相差明显,指导农时的效果并不好,我国古代真正指导农时的是“二十四气”,它实际是一种特殊的“阳历” )
农历的历月长度是以朔望月为准的,大月30天,小月29天,大月和小月相互弥补,使历月的平均长度接近朔望月。
农历固定地把朔的时刻所在日子作为月的第一天——初一日。所谓“朔”,从天文学上讲,它有一个确定的时刻,也就是月亮黄经和太阳黄经相同的那一瞬间。(太阳和月亮黄经的计算十分繁琐和复杂,这里就不予介绍了)
至于定农历日历中月份名称的根据,则是由“中气”来决定的。即以含“雨水”的月份为一月;以含“春分”的月份为二月;以含“谷雨”的月份为三月;以含“小满”的月份为四月;以含“夏至”的月份为五月;以含“大暑”的月份为六月;以含“处暑”的月份为七月;以含“秋分”的月份为八月;以含“霜降”的月份为九月;以含“小雪”的月份为十月;以含“冬至”的月份为十一月;以含“大雪”的月份为十二月。(没有包含中气的月份作为上月的闰月)
农历的历年长度是以回归年为准的,但一个回归年比12个朔望月的日数多,而比13个朔望月短,古代天文学家在编制农历时,为使一个月中任何一天都含有月相的意义,即初一是无月的夜晚,十五左右都是圆月,就以朔望月为主,同时兼顾季节时令,采用十九年七闰的方法:在农历十九年中,有十二个平年,为一平年十二个月;有七个闰年,每一闰年十三个月。
为什么采取“十九年七闰”的方法呢? 一个朔望月平均是29.5306日,一个回归年有12.368个朔望月,0.368小数部分的渐进分数是1/2 、1/3 、3/8 、4/11 、7/19 、46/125, 即每二年加一个闰月,或每三年加一个闰月,或每八年加三个闰月……经过推算,十九年加七个闰月比较合适。因为十九个回归年=6939.6018日,而十九个农历年(加七个闰月后)共有235个朔望月,等于6939.6910日,这样二者就差不多了。
七个闰月安插到十九年当中,其安插方法可是有讲究的。农历闰月的安插,自古以来完全是人为的规定,历代对闰月的安插也不尽相同。秦代以前,曾把闰月放在一年的末尾,叫做“十三月”。汉初把闰月放在九月之后,叫做“后九月”。到了汉武帝太初元年,又把闰月分插在一年中的各月。以后又规定“不包含中气的月份作为前一个月的闰月”,直到现在仍沿用这个规定。
为什么有的月份会没有中气呢? 节气与节气或中气与中气相隔时间平均是30.4368日(即一回归年排65.2422日平分12等分),而一个朔望月平均是29.5306日,所以节气或中气在农历的月份中的日期逐月推移迟,到一定时候,中气不在月中,而移到月末,下一个中气移到另一个月的月初,这样中间这个月就没有中气,而只剩一个节气了。
上面讲过,古人在编制农历时,以十二个中气作为十二个月的标志,即雨水是正月的标志,春分是二月的标志,谷雨是三月的标志……把没有中气的月份作为闰月就使得历月名称与中气一一对应起来,从而保持了原有中气的标志。
从十九年七闰来说,在十九个回归年中有228个节气和228个中气, 而农历十九年有235个朔望月,显然有七个月没有节气和七个月没有中气,这样把没有中气的月份定为闰月,也就很自然了。
农历月的大小很不规则,有时连续两个、三个、四个大月或连续两个三个小月,历年的长短也不一样,而且差距很大。节气和中气,在农历里的分布日期很不稳定,而且日期变动的范围很大。这样看来,农历似乎显得十分复杂。其实。农历还是有一定循环规律的:由于十九个回归年的日数与十九个农历年的日数差不多相等,就使农历每隔十九年差不多是相同的。每隔十九年,农历相同月份的每月初一日的阳历日一般相同或者相差一、二天。每隔十九年,节气和中气日期大体上是重复的,个别的相差一、两天。相隔十九年闰月的月份重复或者相差一个月。
干支纪法
干支就字面意义来说,就相当于树干和枝叶。我国古代以天为主,以地为从,天和干相连叫天干,地和支相连叫地支,合起来叫天干地支,简称干支。
天干有十个,就是甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支有十二个,依次是子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。古人把它们按照一定的顺序而不重复地搭配起来,从甲子到癸亥共六十对,叫做六十甲子。
我国古人用这六十对干支来表示年、月、日、时的序号,周而复始,不断循环,这就是干支纪法。
传说黄帝时代的大臣大挠“深五行之情,占年纲所建,于是作甲乙以名日,谓之干;作子丑以名日,谓之枝,干支相配以成六旬。”这只是一个传说,干支到底是谁最先创立的,现在还没有证实,不过在殷墟出土的甲骨文中,已有表示干支的象形文字,说明早在殷代已经使用干支纪法了。
8. C语言编写一个带农历的万年历
农历算法太复杂了,我查了一下,有个人写出来了,但是我怎么看也看不懂,不知道你能不能看懂! (只是探讨一下,我也想写个农历算法)
首先,我们要确定一个时刻,作为一天的起点(包括这个时刻)。然后我们以月亮通过朔望交界点的那一
天作为每个月的第一天,以太阳通过雨水点的那个月作为正月,依次的,以太阳通过各中气点的那个月作为
二月、三月等等。 经过长期的观察之后,我们就会发现每个月不是29天就是30天,每年不是12个月就是13
个月,每个中气点唯一对应一个月 ,但是有的月却没有中气。为了制定我们的历法,我们至少要知道足够
精度的朔望月长度, 记为ML,和两个中气的间隔时间记为YL,这两个值经过前人长期不懈的观测和计算,
我们知道分别为29.5306日和30.4377日。 接下来,我们要随便找到某一年,以太阳通过雨水点的时刻到
那一年开始的那个时刻的时间,记为DY,以日为单位, 还要找出这一年正月里,月亮通过朔望交界点的时
刻到那一月开始的那个时刻的时间,记为DM,以日为单位。这两个值是要通过实地观测得出来的。 这个时候
,我们就可以通过递推来制订我们的历法,以预测未来月球和太阳的运行情况,并进一步预测月相的变化和
气候的变化。
在本算法中我们使用了三个近似处理:
每天的长度总是一样的;
每个朔望月的长度总是一样的;
每两个相邻中气的时间总是一样的。
接下来,我们就逐月推算每月的大小:
Select Case Fix(DM + ML)
Case is = 29
The month have 29 days.
The DM of next month is DM + ML - 29.
Case is = 30
The month have 30 days.
The DM of next month is DM + ML - 30.
End Select
每年中各月的月份、是否为闰月
For i = 1 to 12
This month has A days.
If DY>=A Then
This month is an Extra Month.
DY = DY - A
Else
This month is the i Month.
DY = DY + YL - A
i = i + 1
End If
Next
这就是我们的核心算法。通过它,我们可以从任何一个包含中气的月份开始向后推算各月各年的情况。
由于我们所用的DM、DY、ML、YL都是近似值,若干年后,我们的历法必有偏差,我们只要重新观测,
更新DM、DY、ML、YL的值就可以了。事实上,诸朝气数最多不过400年,在这些值精确到万分位的时候,
通行一朝是完全可以的。
下面对大小月的排列和闰月的出现作一些定性分析
显然0≤DM<1,那么
DM<0.4694时,当月为小月,下月为大月
DM≥0.4694时,当月为大月
DM<0.4694 * 2时,下月为小月,下下月为大月
DM≥0.4694 * 2时,下月亦为大月,下下月为小月
所以,大小月一般是交替出现,有时会出现连续两个月是大月的情况,但不会出现连续三个
月或更多的是大月的情况,也不会出现连续两个月更多的是小月的情况。也就是说,一般是小月大
月相继出现一段时间后,接着就出现一个大月,然后又是小月大月相继出现,具体的间隔也不定,
大家可以通过计算机推算后,找点规律出来。
一年中最少有十二个月,因为YL * 12 (代表十二个中气循环一次的时间)> ML * 12
(代表十二个朔望月的时间) + 1 (第一个月的DM总小于1),最多有十三个月,因为30
(第一个月的DY总小于30) + YL * 12 < ML * 14。两个相邻中气的间隔时间大于30,
所以一个月不可能有两个中气,那么一年有十二个月的时候,12个中气必然刚好依次各居一个月,
这一年就称为平年,一年有十三个月的时候,必然有且仅有一个月没有中气,那个月就时闰月,
这一年就称为闰年。平年的时候,根据大小月的排列规则,一年最多有8个大月,最少有6个大月,
因为ML * 12 + 1 < 30 * 8 + 29 * (12 - 8),所以不可能有8个大月,最多为7个大月,
那么一年就为354或355天。闰年的时候,根据大小月的排列规则,一年最多有9个大月,
最少有6个大月,因为ML * 13 + 1 < 30 * 8 + 29 * (13 - 8),所以不可能有8个或更多的大月,
最多为7个大月,那么一年就为383或384天。
因为每月的天数不固定,所以闰月的出现规律也不好讨论,连续十二个月的天数也不固定,
所以闰年的出现规律也不好讨论。不过可以肯定是,每年的第一个月肯定不是闰月,因为我们
是以包含中气雨水的月份作为正月,也就是每年的第一个月的。所以,闰月必定出现在某个有
名字的月份后面,出现在哪个后面就叫闰哪月。
9. C++计算农历日期的问题
农历实在不知道的话,我可以帮你解决。请问你需要什么样的要求?
//判断闰年,参数:年份,闰年,返回值:FALSE-失败,TRUE-成功
BOOLIsLeapYear(WORDdwYear,BOOL&bLeapYear);
//计算日期在年内的序数,参数:年,月,日,年内序数,返回值:FALSE-失败,TRUE-成功
BOOLGetDaysNumInYear(WORDdwYear,WORDdwMonth,WORDdwDay,WORD&nDays);
//从年内序数计算月、日,参数:年,年内序数,月,日,返回值:FALSE-失败,TRUE-成功
BOOLGetDateFromDays(WORDdwYear,WORDnDays,WORD&dwMonth,WORD&dwDay);
//获取农历新年的公历年内序数,参数:农历年,返回值:农历新年的公历年内序数
shortLunarGetNewYearOrdinal(WORDdwLunarYear);
//获取农历月的天数,参数:农历年,农历月,是否为闰月,返回值:该农历月的天数,为0代表参数无效
WORDLunarGetDaysofMonth(WORDdwLunarYear,WORDdwLunarMonth,BOOLbLeapMonth);
//获取农历某一年的闰月情况,参数:农历年,返回值,该年的闰月月份,0表示无闰月
WORDLunarGetLeapMonth(WORDdwLunarYear);
//公历转农历,参数:公历年、月、日,农历年、月、日,是否为闰月,返回值:FALSE-失败,TRUE-成功
BOOLGetLunar(WORDdwYear,WORDdwMonth,WORDdwDay,WORD&dwLunarYear,WORD&dwLunarMonth,WORD&dwLunarDay,BOOL&bLeapMonth);
//农历转公历,参数:家历年、月、日,是否为闰月,公历年、月、日,返回值:FALSE-失败,TRUE-成功
BOOLGetGregorian(WORDdwLunarYear,WORDdwLunarMonth,WORDdwLunarDay,BOOLbLeapMonth,WORD&dwYear,WORD&dwMonth,WORD&dwDay);
//得到指定年份的节气信息,首个是小寒
BOOLGetJieQi(WORDdwYear,WORDdwMonth,WORDdwJieQi[2]);
//计算星期,返回-1表示输入的年月日不正确或者超出年份范围
shortGetDayOfWeek(WORDdwYear,WORDdwMonth,WORDdwDay);
//计算某个月的天数,返回天数,如果返回0表示年或月有误
WORDGetDaysOfMonth(WORDdwYear,WORDdwMonth);
以上列举了一些转换函数,详情请见附件的例子,虽然是C语言的,但可以参考或者直接转换成C++,有任何问题可追问或私信,保证帮你解决。
10. c语言实现阳历转农历
就是把日历存下来,要什么就输出什么。。。
农历立法比较复杂,属于阴阳历,难以推算,所以就存下来就好了,信息什么的压缩一下。