전통문화대전망 - 이십사절기 - 왜 윤년 음력이 한 달 더 많고 양력이 하루 더 많습니까?
왜 윤년 음력이 한 달 더 많고 양력이 하루 더 많습니까?
주 =[5+A (실제 일수)] mod 7
2. 주요 분기 계산 공식
60 개 분기의 일련 번호,1->; 59->; 0.
60 개 하위 지점 일련 번호 =[23+A (실제 일수)] mod 60
28, 숙박 계산 공식
28 숙박 일련 번호 =[23+A (실제 일수)] mod 28
4. 실제 일수 a 계산
A=B (0 일) +C (윤일)
B= (연도 계산-1)*365+ (계산할 월, 일, 연도의 일 수)
예: 기본 일수 1984 2 월1b = (1984-1) * 365+(3)
여기서 3 1 은 10 월의 1 일이고 1 은 2 월의 1 일입니다.
기원 308 년 8 월 28 일의 기본 일수.
B = (308-1) * 365+(31+28+31+30+3/kloc)
여기서 (1 개월에서 1 년까지의 일수 계산) 는 양력을 사용하며, 한 달의 일수 규칙이 좋다
내가 초등학교에서 배운 것처럼. 하하의 웃음 ...
C= (연도 계산-1)div 4- 오류 정정+고정 값 2
고정 값 2 는 0 또는 1 입니다. 상수 값은 0 이고 현재 연도 수는 윤년 3 월 (양력 윤년법) 입니다.
1 일 후에 1 입니다.
오류 정정 값 계산:
65438+ 10 월 1 부터 1582 65438+ 10 월 14 까지
1582 65438+ 10 월 15 부터 1699 65438+2 월 3/kloc-0-까지
170 1 년 1 월 1 일부터 각 세기마다 1 이 누적되지만 400 이 될 수 있습니다
1 을 추가합니다. 이 방법은 계산할 수 있다.
-한 가지 질문이 있습니다. 1700 올해의 수정값은 얼마입니까? 알고리즘에는 아무것도 없다.
네, 그런데 10 인 것 같아요.
예 170 1 년 1 년 10 월 1, 오류 수정값은/kloc-에서 나옵니다
190 1 년 1 월 1 일의 오류 수정값은 13 입니다.
그러나 오류 수정 값 200 1 은 13 입니다. 2000 년에는 400 으로 나눌 수 있기 때문에 누적되지 않습니다. 하지만
오류 수정값은 10 1 년 1 월 1 일입니다.
5. 예: 1998.3. 15 주, 지사 및 28 개 게스트 하우스
B = (1998-1) * 365+(31+28+15) =
C = (1998-1) div4-13+0 = 486
A=B+C=728979+486=729465
주 =(5+729465) mod 7=0, 일요일입니다.
주가지의 일련 번호 =( 13+729465) mod 60=58, 마음이다.
28 숙박 일련 번호 =(23+729465) mod 28=4, 즉 방입니다.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
얼마나 무서운가! 다른 공식도 있는데. 그런데 어떤 매개변수들은 어떻게 해야 할지 모르는 것 같아요.
24 절기 알고리즘:
알려진 연도의 인수인계시간에 22 시간 35 분을 더하다. 24 를 넘으면 24 를 빼면 점수는 60 이다.
쳉 1 시간, 즉 8 년 후, 각 기간을 도출합니다.
예를 들어 2000 년 장마철은 16: 22, 2008 년 장마철은 14: 52 입니다.
분.
16: 22+22: 35 = 38: 57 38-24 =14 이기 때문입니다.
기원 원년부터 기원 8 년의 명절까지 이 알고리즘이 실현될 수 있는지 누가 알겠는가. -아주 좋아요
이미지 반전 알고리즘은 이 문제를 해결할 수 있습니다. 누가 해볼까?
음력 윤월 알고리즘:
음력 24 절기 (12 절기, 12 중기) 의 중기가 월말에 떨어지면 음기에 속한다.
지난달부터 나는 중립을 한 적이 없다. 음력은 절기 (절기), 무기 (중기) 를 윤으로 이번 달을 정의한다.
달. 19 는 평균 7 개월 윤달이다.
그런데 24 절기 중 12 절기와 12 기는 어떻게 나누나요? 저는 정보가 없습니다.
아마도 절기와 화기가 있을 것이다. : (
단위 cn 연도
연결
Sysutils 사용
Type TCNDate = Cardinal
함수 decodeggtocndate (dtgreg: tdatetime): tcndate;
기능
GetGregDateFromCN(cnYear, cnMonth, cnday: word; Bleap: 부울 = fal
Se):TDateTime;;
함수 gregdatetocnstr (dtgreg: tdatetime): string;
Function iscnleap (cn date: TCN date): boolean;
수행
Constcstdateorg: integer = 32900; //t 양력 날짜 스케줄 1990-0 1-27
음력1990-01-01에 해당합니다.
Constcstcneyearorg =1990;
Const cstcnttable: array [cstcneyearorg .. cstcneyearorg+60] of
WORD=( // 부호 없는 16 비트
24402,3730,3366,13614,2647,35542,858,1749,
23401,1865,1683,19099,1329
32213,2980,2889,23891,2709,1325,1
39850,1490,3493,61098,3402,3221,1
2773,10970,1746,26469,1829,16/kloc
1370,13678,2902,48978,2898,2898,2853,60715,2635,
1195,21179,1453,2922,/
2645,55901,1206,1461,14030 //2050
//테이블 작성 방법:
//0101110101;
하루, 낙태 29 일,
//윤월은 일반적으로 작은 달로 간주되지만 20 17/06, 2036/06, 2047/05 의 세 가지 특수한 경우가 있습니다.
//특별한 경우 4 자리 윤월 위치 표현의 최고 비트를 1 특별 처리로 설정합니다.
WLeapNormal 변수를 사용합니다.
////2017/06 28330->; 61098 2036/06 27947->; 607 15 2047/05
23133->; 5590 1
//컴파일을 사용하려면 음력이 양력보다 2 개월 뒤지지 않는다는 메시지가 있습니다.
//양력을 음력으로 변환
//반환: 12 자리 연도 +4 자리 월 +5 자리 날짜.
함수 decodeggtocndate (dtgreg: tdatetime): tcndate;
변수를 정의합니다
IDayLeave:Integer;;
WYear, wMonth, wDay:WORD;;
I, j: 정수;
WBigSmallDist, wLeap, wCount, wLeapShift:WORD;;
태그 ok;
시작
결과: = 0;
Idayleave: = trunc (dt Greg)-cstdateorg;
Decode date(in month(dt Greg,-1), wYear, wMonth, wday);
If(iday leave & lt;; 0) 또는 (iDayLeave & gt22295) 를 누른 다음 종료합니다.
//예외가 발생했습니다. 생성 ('현재1990-01-27');
//예외가 발생했습니다. 생성 ('현재 2051-02-11'이전까지만 통계 가능);
For I:= Low(cstcnttable) 에서 High(cstcnttable) 로 시작
Wbigsmalldist: = cstcnttable [I];
W leap: = wbigsmalldist SHR12;
WLeap & gt 라면 시작하세요
WLeap := wLeap 및 7;
Wleapshift: =1;
Else 를 종료합니다
WLeapShift:= 0;;
J:= 1 끝 12 의 경우 시작하십시오
WCount:=(wBigSmallDist 및1)+29;
J=wLeap 인 경우 w w count:= w count-wLeapShift;;
IDayLeave & lt 가 계산을 시작하면
결과: = (I SHL 9)+(j SHL 5)+iday leave+1;
종료;
끝;
Idayleave: = idayleave-w count;
J=wLeap 이면 시작합니다
Wcount: = 29+wleapshift;
IDayLeave & lt 가 계산을 시작하면
결과: = (I SHL 9)+(j SHL 5)+idayleave+1+(1shl21);
종료;
끝;
Idayleave: = idayleave-w count;
끝;
WBigSmallDist := wBigSm