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語言實現陽歷轉農歷
就是把日歷存下來,要什麼就輸出什麼。。。
農歷立法比較復雜,屬於陰陽歷,難以推算,所以就存下來就好了,信息什麼的壓縮一下。