전통문화대전망 - 이십사절기 - 왜 윤년 음력이 한 달 더 많고 양력이 하루 더 많습니까?

왜 윤년 음력이 한 달 더 많고 양력이 하루 더 많습니까?

1. 요일 공식 찾기

주 =[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