>  기사  >  웹 프론트엔드  >  달력 쿼리 알고리즘 특정 요일의 요일 계산 방법은_기본 지식

달력 쿼리 알고리즘 특정 요일의 요일 계산 방법은_기본 지식

WBOY
WBOY원래의
2016-05-16 17:46:422816검색

특정 요일이 무슨 요일인지 어떻게 계산하나요?
——젤러의 공식
역사상 특정 ​​요일이 무슨 요일인가요? 앞으로는 무슨 요일인가요? 이 문제와 관련하여 많은 계산식(2개의 일반 계산식과 일부 조각별 계산식)이 있는데, 그 중 가장 유명한 것이 Zeller식이다. 즉, w=y [y/4] [c/4]-2c [26(m 1)/10] d-1

수식의 기호는 다음과 같은 의미를 갖습니다. w: 주; c: 세기-1 ; y: 연도(두 자리); m: 월(m은 3보다 크거나 같고 14보다 작거나 같습니다. 즉, Zeiler 공식에서 특정 연도의 1월과 2월은 전년도의 13일과 14일로 계산됩니다. 예를 들어 2003년 1월 1일은 2002년 12월 1일로 계산됩니다. d: day; 즉, 정수 부분만 필요합니다. (C는 세기 빼기 1, y는 연도의 마지막 두 자리, M은 월, d는 일입니다. 1월과 2월은 전년도 13, 14월을 기준으로 계산해야 합니다. 이때 , C, y는 모두 1년 값으로 계산됩니다. )

계산된 W를 7로 나누고 나머지가 요일입니다. 나머지가 0이면 일요일이다.

2049년 10월 1일(국경일 100주년)을 예로 들어 Zeller 공식을 사용하여 계산하면 다음과 같습니다.
Zeller 공식: w=y [y/ 4 ] [c/4]-2c [26(m 1)/10] d-1
=49 [49/4] [20/4]-2×20 [26× (10 1)/10] 1 -1
=49 [12.25] 5-40 [28.6]
=49 12 5-40 28
=54 (7로 나누면 나머지는 5)
즉, 10월 1일, 2049년(제100주년 국경일)은 금요일이다.

당신의 생일은 요일(태어난 날, 올해, 내년)입니까? 한번 시도해 보는 것도 좋을 것 같습니다.

그러나 위 공식은 1582년 10월 15일 이후의 상황에만 적합하다(당시 교황은 카이사르가 제정한 율리우스력을 오늘날 사용하는 그레고리력인 그레고리력으로 변경했다).

과정 도출 : (추론에 관심이 없는 분들은 생략하셔도 됩니다)

주일 제도는 고대의 전통을 가지고 있는 제도입니다. 성경 창세기에는 하나님이 세상을 창조하는 데 6일이 걸리고 일곱째 날에 안식했다고 규정하고 있기 때문에 사람들도 7일을 주기로 일과 생활을 정하고, 일요일은 안식일이라고 합니다. 실용적인 관점에서는 7일 주기가 더 적합합니다. 따라서 중국의 전통적인 업무주기는 10일이지만(예를 들어 왕보의 『등왕각 서문』에는 '십십일 안식'이라고 적혀 있는데, 이는 관료들이 열흘을 주기로 일하고 열흘째 되는 날에 휴일을 갖는다는 뜻이다) , 그러나 나중에는 서부 주간 시스템도 채택했습니다.

일상생활에서 우리는 특정 요일이 무슨 요일인지 아는 문제에 자주 직면합니다. 때때로 우리는 역사상 특정 ​​요일이 무슨 요일인지 알고 싶어합니다. 보통 이 문제를 해결하는 가장 효과적인 방법은 달력을 보는 것이지만, 우리는 수천년의 역사를 지닌 만년 달력은커녕 달력을 항상 가지고 다니지도 않습니다. 컴퓨터 프로그래밍에서 특정 요일이 속하는 요일을 계산하려면, 만년력을 미리 저장해 두는 것은 더욱 비현실적이다. 이때, 연월일로부터 요일을 추론하기 위해 어떤 공식을 사용할 수 있는 방법이 있습니까?

답은 '그렇다'입니다. 사실 우리도 종종 이런 일을 합니다. 간단한 예부터 시작해 보겠습니다. 예를 들어, 2004년 5월 1일이 토요일이라는 것을 알고 있다면 "세계 금연의 날"이 2004년 5월 31일인 요일을 계산하는 것은 어렵지 않습니다. 우리는 1일부터 31일까지 손가락으로 셀 수 있고, 동시에 주를 셀 수 있으며, 마침내 5월 31일이 월요일이라는 것을 셀 수 있습니다.
사실 수학적 계산을 할 때는 손가락을 사용할 필요가 없습니다. 우리는 주가 7일 주기로 돌아오는 것을 알고 있으므로 5월 1일이 토요일이고, 7일 후인 5월 8일도 토요일입니다. 날짜로 환산하면 8-1=7이며, 이는 7의 배수입니다. 마찬가지로 5월 15일, 5월 22일, 5월 29일도 토요일이고 해당 날짜와 5월 1일의 차이는 각각 14, 21, 28이며, 이 역시 7의 배수입니다. 5월 31일은 어떻습니까? 31-1=30, 7의 배수는 아니지만 31을 7로 나누면 나머지는 2가 됩니다.
5월 31일 주가 5월 1일 주로부터 이틀 뒤라는 뜻입니다. 토요일 이틀 뒤 월요일이다.

이 간단한 계산을 통해 주 계산에 대한 기본 아이디어를 알 수 있습니다. 먼저 계산하려는 날의 특정 요일인 요일을 알아야 하며, 이 날을 기준으로 삼아야 합니다. 계산의 경우 이는 계산의 "원산지"와 동일합니다.둘째, 계산하려는 날과 결정된 날의 차이가 몇 일인지 알고, 이 날짜의 차이를 7로 나누고, 나머지는 계산하려는 날이 결정된 날의 주 이후 몇 일인지 나타냅니다. 이다. 나머지가 0이면 두 날의 날짜가 같다는 뜻이다. 분명히, "원산지"로 요일을 일요일로 선택하면 나머지는 요일과 정확히 동일하므로 계산이 더 편리해집니다.

하지만 두 날 사이의 일수를 직접 계산하는 것은 여전히 ​​번거롭습니다. 예를 들어 1982년 7월 29일부터 2004년 5월 1일까지의 거리는 7947일로 한 번에 계산할 수 없습니다. 여기에는 세 가지 기간이 포함됩니다. 첫 번째는 1982년 7월 29일 이후의 남은 날짜입니다. 두 번째는 1983년부터 2003년까지 21년 동안의 총 날짜 수입니다. 세 번째는 설날부터 5월까지의 기간입니다. 2004년 1월 1일 일수. 두 번째 기간은 계산하기가 더 쉽습니다. 21*365 5 = 7670일입니다. 이 기간 동안 5번의 윤년이 있기 때문입니다. 첫 번째와 세 번째 문단이 더 까다롭습니다. 예를 들어 세 번째 문단에서는 5월 이전 4개월의 일수에 날짜 값을 더해야 합니다. 즉, 31 29 31 30 1 = 122일입니다. 마찬가지로
문단에서는 7월 이후 5개월의 일수에 7월의 남은 일수를 더해 총 155일이 되어야 합니다.
그러므로 총 간격은 122 7670 155 = 7947일입니다.

잘 생각해 보세요. "원산일"을 12월 31일로 선택하면 첫 번째 기간은 1년이 됩니다. 이렇게 하면 첫 번째 기간과 두 번째 기간이 될 수 있습니다. 전체 연도의 합계가 두 날의 연도 차이에서 1일을 뺀 것과 정확히 같도록 결합하여 계산됩니다. "원산지" 날짜가 기원전 1년 12월 31일(또는 천문학자들이 사용하는 AD 0년 12월 31일)로 추가로 선택되면 전체 연도의 총 숫자는 정확히 계산하려는 날짜에서 1을 뺀 연도가 됩니다. 이렇게 단순화한 후에는 두 가지 기간만 계산하면 됩니다. 첫째, 전체 연도의 총 일수, 둘째, 계산하려는 날짜는 해당 연도의 날짜입니다. 공교롭게도 그레고리력의 연도와 월 설정에 따르면, 기원전 1년 12월 31일은 우연히 일요일이었습니다. 즉, 이렇게 계산된 총 일수를 7로 나눈 나머지가 됩니다. 마침 요일이 있었어요. 따라서 이제 질문은
단 하나입니다. 이렇게 많은 해에 윤년이 몇 번 있습니까? 이를 위해서는 그레고리력의 도약 규칙을 이해해야 합니다.

우리는 그레고리력이 평년에는 365일, 윤년에는 366일인 것을 알고 있습니다. 도약을 정하는 방법은 4로 균등하게 나누어지는 해에는 2월에 하루를 더하는 것인데, 100으로 균등하게 나누어지는 해에는 윤년이 없고, 400으로 균등하게 나누어지는 해에는 도약이 있습니다. 따라서 1600년, 2000년, 2400년 등은 모두 윤년이고, 1700년, 1800년, 1900년, 2100년은 평년입니다. 기원전 1년은 그레고리력에 따르면 윤년이기도 하다.

따라서 기원전 1년 12월 31일(또는 서기 0년)부터 Y년의 특정 날짜까지 전체 연도의 윤년 수는
[(Y -1)과 같습니다. /4] - [(Y-1)/100] [(Y-1)/400],

[...]은 정수 부분만 취한다는 의미입니다. 첫 번째 항목은 4로 나누어지는 연수를 더해야 함을 나타내고, 두 번째 항목은 100으로 나누어지는 연수를 제거해야 함을 나타내며, 세 번째 항목은 400으로 나누어지는 연수를 더해야 함을 나타냅니다. Y를 1씩 줄여야 하는 이유는
특정 요일을 계산하는 첫 번째 공식이 다음과 같기 때문입니다.

W = (Y-1)*365 [(Y -1) /4] - [(Y-1)/100] [(Y-1)/400] 라. (1)

여기서 D는 올해 오늘의 누적 일수입니다. 계산된 W는 기원전 1년(또는 AD 0) 12월 31일과 오늘 사이의 일수입니다. W를 7로 나누면 나머지가 무엇이고, 오늘이 요일이다. 예를 들어 2004년 5월 1일을 계산해 보겠습니다.

W = (2004-1)*365 [(2004-1)/4] - [(2004-1)/100] [(2004-1 ) /400] (31 29 31 30 1) = 731702,
731702 / 7 = 104528...6, 나머지가 6이므로 오늘이 토요일임을 나타냅니다. 이는 사실과 일치합니다.

위의 (1)식은 매우 정확하지만, 계산된 숫자가 너무 커서 사용하기가 매우 불편합니다. 잘 생각해보면 사실 W가 사용된 일수는 7로 나눈 나머지를 구하는 정도이다. 이것은 우리가 이 W 값을 단순화하도록 영감을 줍니다. 정수론 용어로 말하면, 그것과 일치하는 더 작은 양의 정수를 찾는 것입니다. 정확한 주 수를 계산하십시오.

분명히 W가 이렇게 큰 이유는 공식의 첫 번째 항(Y-1)*365가 너무 크기 때문입니다. 실제로

(Y-1)*365 = (Y-1) * (364 1)
= (Y-1) * (7*52 1)
= 52 * ( Y -1) * 7(Y-1),

이 결과의 첫 번째 항은 7의 배수이고, 7로 나눈 나머지는 0이므로 (Y-1)*의 나머지는 365를 7로 나눈 값은 실제로 Y-1을 7로 나눈 나머지와 같습니다. 이 관계는 다음과 같이 표현될 수 있습니다:

(Y-1)*365 pho Y-1 (mod 7).

그 중 SiO2는 정수론에서 합동을 나타내는 기호입니다. Mod 7은 7을 계수(즉, 약수)로 사용하면 ∨ 부호의 양쪽에 있는 숫자가 합동이라는 뜻입니다. 따라서 (Y-1)을 (Y-1)*365로 대체하여 요일 계산에 대한 유명하고 가장 일반적인 공식을 얻을 수 있습니다.

W = (Y- 1 ) [(Y-1)/4] - [(Y-1)/100] [(Y-1)/400] D. (2)

이 공식은 사용하기가 훨씬 쉽지만 누적 일수 D 계산도 번거롭기 때문에 가장 유용한 공식은 아닙니다
. 월과 날짜를 사용하여 직접 계산할 수 있나요? 대답도 그렇습니다.각
월의 일수를 관찰하는 것이 좋습니다. 목록은 다음과 같습니다.

월: 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월
------------------------------- ---- -------------
일수: 31 28(29) 31 30 31 30 31 31 30 31 30 31

이 일수에서 28(=4*7)을 빼도 W를 7로 나눈 나머지 값에는 영향을 주지 않습니다. 이런 방식으로 또 다른
테이블을 얻습니다:

월: 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월
--- -- ------------------------------------------------ -- ----------------
남은 일수: 3 0(1) 3 2 3 2 3 3 2 3 2 3
평년 누적: 3 3 6 8 11 13 16 19 21 24 26 29
윤년 누적 : 3 4 7 9 12 14 17 20 22 25 27 30

자세히 살펴보면 1~2월 제외, 3~7월 있음 1월 5개월의 남은 날수는 3,2,3,2,3이고, 8월부터 12월까지 5개월의 남은 날수는 3,2,3,2,3이므로 정확히 반복입니다. 해당 누적일수 중 다음달 누적일수와 전월 누적일수의 차이에서 28일을 뺀 값이 바로 이 반복이다. 이 규칙이 있기 때문에 평년과 윤년의 누적 일수를 수학 공식으로 쉽게 표현할 수 있습니다.

╭ d (M = 1인 경우)
D = { 31 d; (M=2일 때) (3)
╰ [ 13 * (M 1) / 5 ] - 7 (M-1) * 28 d i. (M≥3인 경우)

여기서 [...]는 여전히 정수 부분만 취함을 의미합니다. M과 d는 각각 계산하려는 월과 일입니다. 윤년에는 i=1입니다. M≥3이라는 표현을 설명해야 합니다. [13*(M 1)/5]-7은 위 두 번째 표의 연간 평균 누적 값으로 계산됩니다. (M-1)*28을 더하면 총 개수를 계산합니다. 해당 월 이전의 모든 달의 일수입니다. 이것은 반올림 연산을 사용하여 3,2,3,2,3의 순환을 실현하는 매우 영리한 방법입니다. 예를 들어, 2004년 5월 1일의 경우 다음과 같습니다.

D = [ 13 * (5 1) / 5 ] - 7 (5-1) * 28 1 1
= 122,

이것이 바로 2004년 5월 1일의 누적일수입니다.

또 다른 변경을 수행하고 1월과 2월을 전년도의 "13일"과 "14일"로 처리한다고 가정해 보겠습니다. 이 공식을 준수할 뿐만 아니라 이로 인해 윤일도 0이 됩니다. 이전 "연도"(총 14개월)의 마지막 날이 d의 일부가 되므로 윤년의 영향도 제거되고 공식은 다음과 같이 단순화됩니다.

D = [ 13 * (M 1) / 5 ] - 7 (M-1) * 28 라. (3≤M≤14) (4)

위의 요일 계산 공식은 다음과 같이 더 단순화될 수 있습니다.

W = (Y-1) [(Y-1 )/ 4] - [(Y-1)/100] [(Y-1)/400] [ 13 * (M 1) / 5 ] - 7 (M-1) * 28 d.

-7과 (M-1)*28은 모두 7로 나누어지기 때문에 이 두 항목을 제거하면 W를 7로 나눈 나머지는 그대로 유지되며 수식은 다음과 같습니다.

W = (Y-1) [(Y-1)/4] - [(Y-1)/100] [(Y-1)/400] [ 13 * (M 1) / 5 ] d. (5)

물론, 1월과 2월은 전년도의 13번째와 14번째 달로 간주되므로, M을 제외한 1월과 2월의 요일을 계산할 때 주의해야 합니다. , 누르기 13 또는 14를 셀 때 Y 연도에도 1을 빼야 합니다. 예를 들어, 2004년 1월 1일은 목요일입니다.

W = (2003-1) [(2003-1)/4] - [(2003-1)/100 ] [( 2003-1)/400] [13*(13 1)/5]
1
= 2002 500 - 20 5 36 1
= 2524
2524 / 7 = 360… 이는 현실과 일치합니다.

수식 (5)는 이미 연, 월, 일로부터 요일을 계산하는 수식이지만, 아직 연도 처리를 개선할 수 있는 방법이 가장 간결하지는 않습니다. 먼저 이 공식을 사용하여 각 세기의 첫 해 3월 1일의 주를 계산해 보겠습니다.

연도: 1(401,801,…,2001) 101(501,901,…,2101)
---------------------------------- --- ------------------
주: 4 2
=================== === ========================
연도: 201(601,1001,…,2201) 301(701,1101,…, 2301)
----------------------------------------------- --- -------
주: 0 5

이번 주는 4세기마다 반복되는 것을 볼 수 있습니다. 301년 3월 1일의 주 수(701, 1101,..., 2301)를 -2로 간주하면(정수론의 나머지 정의에 따르면 -2는 5를 7로 나눈 나머지와 같습니다.) 따라서 이 변환과 같이 수행할 수 있습니다.) 그러면 이 반복 시퀀스는 정확히 4,2,0,-2의 산술 시퀀스입니다. 이를 바탕으로 각 세기의 첫 해 3월 1일 요일을 계산하는 다음 공식을 얻을 수 있습니다.

W = (4 - C mod 4) * 2 - 4. (6)

공식에서 C는 세기에서 1을 뺀 숫자이고, mod는 모듈로 연산, 즉 나머지를 구하는 것을 나타낸다. 예를 들어 2001년 3월 1일 C=20이면

W = (4 - 20 mod 4) * 2 - 4
= 8 - 4
= 4입니다.

식 (6)을 식 (5)에 대입하면 변환 후 다음을 얻을 수 있습니다.

(Y-1) [(Y-1)/4] - [(Y-1 ) /100] [(Y-1)/400] ‚ (4 - C mod 4) * 2 - 1
(mod 7). (7)

따라서 식 (5)에서 (Y-1) [(Y-1)/4] - [(Y-1)/100] [(Y-1)/400] 각 세기의 첫 번째 연도의 요일을 계산할 때 네 개의 항은 (4 - C mod 4) * 2 - 1로 대체될 수 있습니다. 이 공식은 다음과 같이 작성됩니다:

W = (4 - C mod 4) * 2 - 1 [13 * (M 1) / 5] d. (8)

각 세기의 첫 해의 날짜와 주를 계산하는 공식을 이용하면, 그 세기의 다른 해의 날짜와 주를 계산하는 공식을 쉽게 구할 수 있습니다.한 세기 동안 00으로 끝나는 해가 마지막 해이기 때문에 "백년에 도약하지 않고, 400년에 도약한다"는 규칙을 고려할 필요가 없고 "4에 한 번 도약"하는 규칙만 고려하면 됩니다. 연령". 공식 (1)을 공식 (2)로 단순화하는 방법에 따라 공식 (5)보다 공식 (8)에서 더 간단한 공식을 얻어 특정 요일의 요일을 계산할 수 있습니다.

W = (4 - C mod 4) * 2 - 1 (y-1) [y/4] [13 * (M 1) / 5] d. (9)

여기서 y는 연도의 마지막 두 자리입니다.

모듈로 연산이 4개의 산술 연산이 아니라는 점을 고려하면 (4 - C mod 4) * 2를 4개의 산술 연산만 포함하는 표현식으로 다시 작성할 수 있습니다. 몫 q와 1 C를 4로 나눈 세기의 나머지 r 사이에는 다음과 같은 관계가 있기 때문입니다.

4q r = C,

여기서 r은 C mod 4이므로,

r = C - 4q
= C - 4 * [C/4]가 있습니다. (10)

그러면

(4 - C mod 4) * 2 = (4 - C 4 * [C/4]) * 2
= 8 - 2C 8 * [ C/4]
EMA [C/4] - 2C 1(mod 7). (11)

방정식 (11)을 (9)에 대입하면 다음을 얻습니다.

W = [C/4] - 2C y [y/4] [13 * (M 1) / 5] ㄷ - 1. (12)

이 공식은 세기, 연도의 마지막 두 자리, 월, 일에서 1을 뺀 후 7로 나누어 W를 계산할 수 있습니다. 얻은 나머지가 해당 날짜를 나타냅니다. 유일한 요구 사항은 1월과 2월을 전년도의 13번째와 14번째 달로 처리하고 C와 y 모두 전년도에 따라 값을 지정하는 것입니다. 따라서 일반적으로 특정 날짜의 요일을 계산하는 가장 좋은 공식으로 간주됩니다. 이 공식은 독일의 수학자 Christian Zeller(1822-1899)가 1886년에 처음 도출했기 때문에 일반적으로 Zeller의 공식으로 알려져 있습니다. 구두 계산을 쉽게 하기 위해 수식에서 [13 * (M 1) / 5]를 [26 * (M 1) / 10]으로 쓰는 경우가 많습니다.

이제 2004년 5월 1일의 주를 계산해 보겠습니다. 물론 C=20, y=4, M=5, d=1을 Zeiler의
공식으로 바꾸면 다음과 같습니다.

W = [20/4] - 40 4 1 [13 * (5 1) / 5] 1 - 1
= -15.

음수의 나머지는 일반적인 나머지 개념에 따라 계산할 수 없고 정수 이론의 나머지 정의에 따라서만 계산할 수 있습니다. 계산을 쉽게 하기 위해 7의 정수배를 더해 양수로 만들 수 있습니다. 예를 들어 70을 더하면 55가 됩니다. 다시 7로 나누면 나머지가 6이 되어 오늘이 토요일임을 알 수 있습니다. 이는 현실과 일치하며 식 (2)에 의해 계산된 결과와도 일치합니다.

마지막으로 위의 수식은 모두 그레고리력의 도약규칙을 기반으로 한다는 점에 유의해야 합니다. Zeiler는 율리우스력의 경우 해당 공식도 도출했습니다:

W = 5 - C y [y/4] [13 * (M 1) / 5] d - 1. (13)

이렇게 해서 우리는 달력을 전혀 참고하지 않고도 특정 요일의 요일을 계산하는 문제를 마침내 해결했습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.