이 문서가 다루는 것
운세를 다루는 사이트의 상당수는 간지나 절기 같은 값을 외부 서비스에서 받아오거나, 누군가 미리 만들어 둔 표를 그대로 읽어 옵니다. 운세한잔은 그렇게 하지 않습니다. 간지·24절기·음력·손없는날·삼재 계산을 만세력 모듈 한 곳에 직접 구현했고, 화면에 보이는 값은 접속하신 시각(한국 표준시)을 기준으로 그 자리에서 계산됩니다. 어떤 날짜를 넣어도 같은 값이 나오는 순수한 계산 함수라, 저장된 결과를 꺼내 오는 것이 아니라 매번 다시 구합니다.
계산을 직접 한다는 말은 곧 틀릴 수도 있다는 뜻입니다. 그래서 이 문서에는 무엇을 어떻게 계산하는지뿐 아니라, 무엇과 대조해 검증했고 어떤 해에 어긋나서 보정했는지, 그리고 아직 계산하지 않는 값이 무엇인지까지 함께 적었습니다. 회귀 테스트 스크립트가 앵커 값을 매번 다시 확인하도록 해 두었고, 어긋난 사례는 감추지 않고 보정표에 남깁니다. 계산이 정확하다는 주장보다, 어디까지 확인했고 어디부터는 확인하지 못했는지를 밝히는 편이 더 정직하다고 생각합니다.
간지(干支) — 60갑자와 율리우스 적일
간지는 천간(天干) 열 글자와 지지(地支) 열두 글자를 하나씩 짝지어 만드는 이름표입니다. 10과 12의 최소공배수가 60이므로 짝은 60개에서 한 바퀴를 돌고, 이것을 60갑자라 부릅니다. 해에 붙이면 세차(歲次), 달에 붙이면 월건(月建), 날에 붙이면 일진(日辰)입니다.
해의 간지는 어렵지 않습니다. 서기 연도에서 4를 뺀 값을 10과 12로 나눈 나머지가 각각 천간과 지지가 됩니다. 서기 4년이 갑자년이기 때문입니다. 예를 들어 2026년은 2026 − 4 = 2022이고, 2022를 10으로 나눈 나머지가 2라 천간은 병(丙), 12로 나눈 나머지가 6이라 지지는 오(午)입니다. 그래서 병오년입니다.
날의 간지는 이렇게 간단하지 않습니다. 그레고리력에는 4년마다의 윤년, 100년마다의 예외, 400년마다의 예외가 겹쳐 있어 두 날짜 사이에 며칠이 흘렀는지를 날짜 문자열만 보고는 셀 수 없기 때문입니다. 그래서 먼저 날짜를 율리우스 적일(Julian Day Number, JDN)로 바꿉니다. JDN은 기원전 4713년의 어느 날부터 하루에 하나씩 붙여 온 통짜 정수라, 두 값의 차이가 곧 경과 일수가 됩니다. 변환에는 Fliegel–Van Flandern 알고리즘을 씁니다.
율리우스 적일 변환 (Fliegel–Van Flandern)
a = floor((14 - month) / 12)
y = year + 4800 - a
m = month + 12a - 3
JDN = day + floor((153m + 2) / 5) + 365y
+ floor(y/4) - floor(y/100) + floor(y/400) - 32045남은 일은 기준점 하나를 정하는 것입니다. 운세한잔은 1949년 10월 1일을 갑자일로 잡았습니다. 이 날의 JDN은 2433191이고, 여기에 49를 더해 60으로 나누면 나머지가 정확히 0이 됩니다. 즉 60갑자의 0번인 갑자에 딱 떨어집니다. 이후로는 어떤 날짜든 (JDN + 49) % 60 으로 0에서 59 사이의 번호를 얻고, 그 번호를 10으로 나눈 나머지가 천간, 12로 나눈 나머지가 지지입니다. 앵커 하나만 맞으면 그 앞뒤 수천 년이 원리적으로 어긋나지 않는 구조입니다.
명리에서 한 해의 경계는 1월 1일이 아니라 입춘입니다. 그래서 세차를 구할 때는 먼저 그 해의 입춘 절입일을 계산한 뒤, 날짜가 입춘 이전이면 전년도 간지를 씁니다. 2026년을 예로 들면 2월 3일까지는 아직 을사년이고, 입춘인 2월 4일부터 병오년이 됩니다. 새해 첫날에 띠가 바뀌는 것으로 알고 계신 분이 많지만, 사주를 볼 때 쓰는 경계는 입춘 쪽입니다.
| 천간 | 음양 | 오행 | 오방색 |
|---|---|---|---|
| 갑 (甲) | 양(陽) | 목(木) | 청(靑) |
| 을 (乙) | 음(陰) | 목(木) | 청(靑) |
| 병 (丙) | 양(陽) | 화(火) | 적(赤) |
| 정 (丁) | 음(陰) | 화(火) | 적(赤) |
| 무 (戊) | 양(陽) | 토(土) | 황(黃) |
| 기 (己) | 음(陰) | 토(土) | 황(黃) |
| 경 (庚) | 양(陽) | 금(金) | 백(白) |
| 신 (辛) | 음(陰) | 금(金) | 백(白) |
| 임 (壬) | 양(陽) | 수(水) | 흑(黑) |
| 계 (癸) | 음(陰) | 수(水) | 흑(黑) |
해마다 붙는 색깔 이름은 이 표에서 나옵니다. 2026년이 ‘붉은 말의 해’로 불리는 것은 천간 병(丙)의 오방색이 적(赤)이고 지지 오(午)의 띠가 말이기 때문입니다. 2024년의 ‘푸른 용’도 같은 방식입니다. 갑(甲)이 청(靑)이고 진(辰)이 용이라 청룡이 됩니다. 신비한 작명이 아니라 표에서 두 글자를 읽어 붙인 결과입니다.
24절기 — 수성공식과 보정표
24절기는 태양이 황도를 15도씩 지날 때마다 붙인 이름입니다. 달의 움직임과 무관한 태양력이라 양력 날짜가 해마다 거의 같은 자리에 옵니다. 입춘이 늘 2월 4일 언저리, 동지가 늘 12월 22일 언저리인 이유입니다. 정확한 절입 시각까지 구하려면 태양의 황경을 천문 계산으로 풀어야 하지만, 날짜 단위라면 훨씬 간단한 근사식으로 충분합니다.
운세한잔은 수성공식(壽星公式)을 씁니다. 절기마다 정해진 상수 하나와 윤년 보정만으로 그 해의 절입일을 구하는 방식입니다.
수성공식 — 절입일 계산
D = floor(Y × 0.2422 + C) - L Y = 연도의 뒤 두 자리 (2026 → 26) C = 절기별 · 세기별 상수 (입춘 21세기 = 3.87) L = floor(Y / 4) (윤년 보정) ※ 1 · 2월 절기는 L = floor((Y - 1) / 4)
1월과 2월의 절기(소한·대한·입춘·우수)에 예외를 두는 이유는 간단합니다. 그 해의 2월 29일을 아직 지나지 않았기 때문에 윤년 보정을 한 해 늦춰 적용해야 합니다. C 상수는 20세기용과 21세기용이 따로 있고, 24개 절기마다 값이 다릅니다.
2026년 입춘을 실제로 넣어 보겠습니다. Y = 26, 입춘의 21세기 상수 C = 3.87, 1·2월 절기이므로 L = floor(25 / 4) = 6입니다. 26 × 0.2422 = 6.2972이고 여기에 3.87을 더하면 10.1672, 내림하면 10, 여기서 6을 빼면 4가 나옵니다. 2026년 입춘은 2월 4일입니다.
문제는 이 공식이 완벽하지 않다는 데 있습니다. 실제 절입 시각이 자정 근처에 놓이는 해에는 계산 결과가 하루 어긋납니다. 그래서 계산값을 그대로 화면에 내보내지 않고, 한국천문연구원(KASI)이 발표한 역서 날짜와 하나씩 대조한 뒤 어긋난 해만 보정표에 등록해 가감하도록 했습니다.
대조 결과를 있는 그대로 적습니다. 2025년은 24절기 전체를 확인해 24건 모두 일치했습니다. 2024년부터 2030년까지는 기준이 되는 여섯 절기(입춘·춘분·입추·하지·추분·동지)를 뽑아 42건을 확인했고, 그 가운데 40건이 일치했습니다. 어긋난 두 건은 2028년 하지와 2029년 추분입니다. 여기에 별도로 확인한 2026년 우수와 망종 두 건을 더해, 현재 보정표에는 모두 네 건이 등록돼 있습니다.
| 연도 | 절기 | 공식 계산 | 발표값 | 보정 |
|---|---|---|---|---|
| 2026 | 우수 (雨水) | 2월 19일 | 2월 18일 | −1일 |
| 2026 | 망종 (芒種) | 6월 5일 | 6월 6일 | +1일 |
| 2028 | 하지 (夏至) | 6월 21일 | 6월 20일 | −1일 |
| 2029 | 추분 (秋分) | 9월 23일 | 9월 22일 | −1일 |
어긋난 폭은 네 건 모두 하루였습니다. 이 방식의 오차 한계가 ±1일이며, 그 하루를 대조로 잡아내는 구조라는 뜻입니다. 반대로 말하면 아직 대조하지 않은 연도에서 새로운 불일치가 나올 가능성은 남아 있습니다. 보정표는 닫힌 목록이 아니라 열린 목록이며, 확인되는 대로 추가합니다. 어긋난 사례를 발견하시면 알려 주시기 바랍니다.
음력 변환 — 1900~2050년 대조표
음력은 달의 삭망 주기를 따르기 때문에 공식 하나로 깔끔하게 풀리지 않습니다. 한 달이 29일일 때도 30일일 때도 있고, 열두 달로는 태양년을 채우지 못해 몇 해에 한 번씩 윤달을 끼워 넣습니다. 그래서 운세한잔은 근사식 대신 1900년부터 2050년까지 151년치를 담은 대조표를 씁니다.
표는 한 해를 17비트 정수 하나로 압축합니다. 하위 네 비트는 그 해의 윤달 번호이고 0이면 윤달이 없다는 뜻입니다. 그 위 열두 비트는 1월부터 12월까지 각 달이 30일인 대월(大月)인지 29일인 소월(小月)인지를 나타내고, 마지막 한 비트는 윤달 자체가 30일인지를 나타냅니다. 기준일은 양력 1900년 1월 31일로, 이 날이 음력 1900년 1월 1일입니다. 양력 날짜를 넣으면 기준일부터의 경과 일수를 세어 표를 훑어 내려가며 음력 연·월·일과 윤달 여부를 얻습니다.
표 방식의 위험은 값이 하나만 틀려도 그 뒤가 전부 밀린다는 데 있습니다. 그래서 회귀 테스트가 설날(음력 1월 1일) 여섯 건과 추석(음력 8월 15일) 일곱 건, 모두 열세 건의 앵커를 실행할 때마다 다시 확인합니다. 여기에 더해 하루씩 이동할 때 음력 날짜도 반드시 하루씩만 움직이는지, 윤달의 위치가 표와 맞는지, 표 밖의 연도를 넣으면 값을 만들어 내지 않고 빈 값을 돌려주는지도 함께 검사합니다.
실제로 이 검증에서 오류를 찾은 적이 있습니다. 1978년과 1996년 두 해의 월 대소 비트가 어긋나 있었고, 증상은 두 해의 추석이 음력 8월 16일로 나오는 것이었습니다. 원인을 확인하려고 Meeus 천문 알고리즘으로 삭(朔) 시각을 독립적으로 계산해 대조했습니다. 1996년 9월의 삭은 한국 시간으로 자정에서 여덟 시간 넘게 떨어져 있어, 경계 근처의 애매한 판정이 아니라 표 값 자체의 오류임이 분명했습니다. 두 해 모두 총일수는 그대로라 인접 연도의 경계는 움직이지 않았습니다. 앵커가 최근 연도에만 몰려 있어 수십 년 전 구간의 오류를 놓치고 있었던 것이라, 이후 앵커를 1978년까지 넓혔습니다.
손없는날은 이렇게 얻은 음력 날짜에서 판정합니다. 음력 날짜의 끝자리가 9 또는 0인 날, 그러니까 9·10·19·20·29·30일이 손없는날입니다. 전통적으로 ‘손(損)’이라 불리는 방위신이 열흘을 주기로 동·서·남·북을 이틀씩 돌다가 남은 이틀은 하늘로 올라가 사람의 일에 관여하지 않는다고 보았기 때문입니다. 판정 자체는 나머지 연산 한 줄이지만, 그 앞의 음력 변환이 정확해야 결과가 맞습니다. 손없는날 계산의 신뢰도는 사실상 음력표의 신뢰도입니다.
삼재 판정 — 십이지 삼합
삼재는 자신의 띠를 기준으로 12년에 한 번, 3년 동안 조심하라고 전해지는 민간 신앙입니다. 계산 규칙 자체는 명확합니다. 열두 띠를 네 칸씩 건너뛰며 세 개씩 묶은 삼합(三合) 그룹이 기준이고, 그룹마다 삼재가 드는 세 해가 정해져 있습니다.
세 해는 순서대로 들삼재(첫해)·눌삼재(둘째 해)·날삼재(셋째 해)라 부릅니다. 들어오는 해, 머무는 해, 나가는 해라는 뜻입니다. 코드는 네 그룹의 대응 관계를 표로 만들어 두고, 조회 연도의 지지가 그 목록의 몇 번째에 있는지로 단계를 정합니다.
| 삼합 그룹 | 해당 띠 | 삼재가 드는 해 |
|---|---|---|
| 신자진 (申子辰) | 원숭이 · 쥐 · 용 | 호랑이 · 토끼 · 용 해 (인묘진) |
| 사유축 (巳酉丑) | 뱀 · 닭 · 소 | 돼지 · 쥐 · 소 해 (해자축) |
| 인오술 (寅午戌) | 호랑이 · 말 · 개 | 원숭이 · 닭 · 개 해 (신유술) |
| 해묘미 (亥卯未) | 돼지 · 토끼 · 양 | 뱀 · 말 · 양 해 (사오미) |
예를 들어 1995년생은 돼지띠이므로 해묘미 그룹에 속하고, 삼재 구간은 뱀·말·양 해인 2025·2026·2027년입니다. 2026년은 그 두 번째 해이므로 눌삼재에 해당합니다. 회귀 테스트가 이 사례를 포함해 어떤 출생 연도를 넣어도 삼재 구간이 반드시 연속한 3년으로 나오는지, 12년마다 다시 돌아오는지를 확인합니다.
다만 삼재는 앞의 간지·절기·음력과 성격이 다릅니다. 간지와 절기는 규칙이 정해진 역법 계산이라 맞고 틀림을 말할 수 있지만, 삼재가 실제로 불행을 가져온다는 주장에는 확인된 근거가 없습니다. 저희가 보장하는 것은 ‘전해지는 규칙대로 정확히 계산했다’는 것까지이며, 그 규칙의 예언력까지는 아닙니다. 삼재에 들었다는 결과를 보셨다면 겁을 내기보다, 한 해를 조금 더 조심스럽게 시작하는 계기 정도로 받아들이시길 권합니다.
운세 문장 선택 — 결정론적 해시 시드
여기서부터는 역법이 아니라 콘텐츠의 영역입니다. 오늘의 운세나 띠별 운세가 보여 주는 문장은 저희가 미리 써 둔 문장 풀에서 고른 것입니다. 어떤 문장을 쓰느냐만큼 중요한 것이 ‘어떻게 고르느냐’입니다.
가장 흔한 방식은 난수 함수를 부르는 것입니다. 하지만 그러면 같은 사람이 새로고침할 때마다 다른 운세가 나옵니다. 아침에 본 운세와 점심에 본 운세가 다르면 그것은 운세가 아니라 뽑기입니다. 마음에 드는 결과가 나올 때까지 새로고침하게 만드는 구조이기도 합니다. 그래서 운세한잔은 결과 화면에 난수를 쓰지 않고 시드를 고정합니다.
절차는 두 단계입니다. 먼저 입력값(생년월일·이름·띠 등)과 오늘 날짜 문자열을 이어 붙인 뒤 FNV-1a 32비트 해시로 정수 하나를 만듭니다. 그 정수를 mulberry32 유사난수 생성기의 시드로 넣으면, 같은 시드에서는 언제나 같은 순서의 수열이 나옵니다. 문장 선택, 별점, 행운의 숫자와 색은 모두 이 수열에서 순서대로 꺼내 씁니다.
결정론적 선택 절차
seed = fnv1a(입력값 + "|" + "YYYY-MM-DD") rng = mulberry32(seed) 문장 = pool[floor(rng() × pool.length)] 별점 = 문장의 tone 값에서 유도
결과적으로 같은 입력이면 하루 동안 같은 결과가 나오고, 날짜 문자열이 바뀌는 자정이 지나면 새로 계산됩니다. 새로고침해도 결과가 흔들리지 않습니다. 난수 함수는 타로에서 카드를 섞는 애니메이션처럼 화면에 남지 않는 연출에만 쓰고, 결과값에는 쓰지 않습니다. 별점도 따로 굴리지 않고 뽑힌 문장에 붙어 있는 상태 값에서 끌어옵니다. 문장은 좋은 말인데 별이 하나인 상황이 생기지 않도록 하기 위해서입니다.
이 방식에는 부수 효과가 하나 더 있습니다. 결과를 만드는 데 필요한 정보가 입력값과 날짜뿐이므로, 운세 계산을 위해 방문자를 식별하거나 이전 방문을 기억할 필요가 없습니다. 이름·생년월일·출생연도의 원문은 브라우저에서만 계산되며 서버·공유 URL·Google 분석·광고 요청에 포함되지 않습니다.
문장 풀은 다음과 같이 준비돼 있습니다. 모든 문장은 한국어와 영어 두 벌로 작성했고, 확장분은 기존 문장과 소재나 문형이 겹치지 않도록 따로 써서 합쳤습니다.
| 문장 풀 | 개수 | 구성 |
|---|---|---|
| 오늘의 운세 총평 | 200 | 기본 50 + 확장 150. great · good · soso · caution 4단계 |
| 금전 · 애정 · 건강 · 직장 | 각 100 | 항목마다 기본 30 + 확장 70, 합계 400 |
| 띠별 운세 | 720 | 12띠 × (오늘 · 주간 · 월간) × 20 |
| 별자리 운세 | 720 | 12별자리 × (오늘 · 주간 · 월간) × 20 |
| 타로 카드 | 78 | 메이저 22 + 마이너 56, 정방향·역방향 해석 별도 |
타로 78장을 뺀 운세 문장만 더해도 2,040개(200 + 400 + 720 + 720)이며, 한국어와 영어를 따로 세면 4,080개입니다. 타로 78장의 그림은 외부 이미지를 불러오지 않고 SVG와 CSS로 제작했습니다. 이 덕분에 카드 아트를 위한 외부 이미지 CDN 요청은 없습니다. 방문 통계와 광고를 위한 Google 요청은 이 계산·이미지 경로와 별개이며 개인정보처리방침에 따로 설명합니다.
한계와 주의
정확도를 말하려면 못 하는 것부터 밝히는 편이 낫습니다. 현재 확인된 한계는 다음과 같습니다.
절기 시각은 계산하지 않습니다
24절기는 날짜만 제공하고 절입 시각(시·분)은 구하지 않습니다. 시주(時柱)를 따지거나 절입 당일의 앞뒤를 시간 단위로 가려야 하는 경우에는 이 사이트의 값만으로는 부족합니다.
공식 역법은 한국천문연구원 기준입니다
저희 계산값은 참고용입니다. 공휴일, 절기 시각, 대체공휴일처럼 공적으로 확인해야 하는 정보는 한국천문연구원(KASI)이 발표한 역서를 따라 주시기 바랍니다.
음력 조회 범위는 1900~2050년입니다
대조표가 다루는 범위 밖의 날짜는 추정치를 만들어 내지 않고 빈 값을 반환합니다. 화면에서는 음력 칸이 비어 보입니다. 없는 값을 그럴듯하게 채우는 것보다 비워 두는 편이 정직하다고 판단했습니다.
시간대는 한국 표준시(UTC+9) 고정입니다
해외에서 접속하셔도 한국 표준시 기준 날짜로 계산합니다. 현지 날짜와 하루 차이가 날 수 있습니다. 만세력과 명리의 기준이 한국 시간이라 이렇게 맞췄습니다.
운세 해석은 오락용입니다
계산이 정확하다는 것과 해석이 맞는다는 것은 전혀 다른 이야기입니다. 간지·절기·음력은 규칙이 정해진 역법이라 정답을 말할 수 있지만, 그 값에서 성격이나 미래를 읽어 내는 해석에는 과학적 근거가 없습니다. 건강·재정·법률처럼 중요한 결정은 반드시 해당 분야 전문가와 상의하시기 바랍니다.
자주 묻는 질문
계산 결과가 다른 만세력 사이트와 하루 다를 때가 있습니다. 왜 그런가요?
가장 흔한 원인은 절입 시각입니다. 저희는 절기를 날짜 단위로만 계산하고 시·분은 구하지 않아서, 절입 시각이 자정 가까이 놓인 해에는 시각까지 따지는 곳과 하루 차이가 날 수 있습니다. 두 번째 원인은 연도 경계입니다. 저희는 명리 기준을 따라 1월 1일이 아니라 입춘을 한 해의 경계로 잡습니다. 세 번째는 시간대로, 저희는 접속 위치와 무관하게 한국 표준시를 씁니다. 어긋난 사례를 알려 주시면 한국천문연구원 발표값과 대조해 확인하고, 저희 쪽 오류라면 보정표에 등록합니다.
외부 API를 쓰지 않으면 값이 부정확하지 않나요?
정확도는 API를 쓰느냐가 아니라 무엇과 대조했느냐로 결정됩니다. 간지는 율리우스 적일이라는 확정된 정수 체계 위에서 나머지 연산만 하므로 앵커 하나만 맞으면 원리적으로 어긋나지 않습니다. 절기는 근사식이라 오차가 생길 수 있어 한국천문연구원 발표값과 대조해 보정하고 있고, 음력은 널리 쓰이는 대조표를 채택하되 설날·추석 앵커 13건으로 회귀 테스트를 겁니다. 실제로 그 테스트가 1978년과 1996년의 표 오류를 잡아냈습니다. 다만 대조하지 않은 구간까지 완벽하다고 주장하지는 않습니다.
같은 생년월일이면 다른 사람과 운세가 똑같이 나오나요?
네, 같은 도구에 같은 입력을 넣으면 같은 날에는 같은 결과가 나옵니다. 시드가 입력값과 날짜로 정해지는 의도한 설계입니다. 결과를 만드는 데 계정이나 서버 저장이 필요하지 않으며, 이름·생년월일·출생연도의 원문은 기기 안에서 계산한 뒤 서버·URL·Google 요청에 포함하지 않습니다.
새로고침하면 운세가 바뀌나요?
바뀌지 않습니다. 결과는 입력값과 날짜를 이어 붙인 문자열의 해시 시드로 정해지므로 하루 동안 고정되고, 자정이 지나 날짜 문자열이 바뀌면 새로 계산됩니다. 난수 함수는 타로에서 카드를 섞어 보여 주는 애니메이션처럼 화면에 결과로 남지 않는 연출에만 씁니다.
절기 보정표에 등록된 네 건은 어떻게 찾았나요?
수성공식으로 계산한 날짜를 한국천문연구원이 발표한 역서 날짜와 하나씩 대조해 찾았습니다. 2025년은 24절기 전체를 확인해 24건 모두 일치했고, 2024년부터 2030년까지는 기준이 되는 여섯 절기 42건을 확인해 40건이 일치했습니다. 어긋난 2028년 하지와 2029년 추분, 그리고 별도로 확인한 2026년 우수와 망종을 더해 네 건을 보정표에 등록했습니다. 어긋난 폭은 네 건 모두 하루였습니다.
입력한 생년월일이나 이름은 어디에 저장되나요?
이름·생년월일·출생연도의 원문은 저장하지 않습니다. 운세와 만세력 계산 모듈은 브라우저에서 실행되고 외부 API를 호출하지 않으며, 원문 입력값은 서버·주소창·공유 링크·Google 요청에 포함되지 않습니다. Google Analytics·AdSense가 별도로 처리할 수 있는 방문·기기·광고 정보와 쿠키는 개인정보처리방침에 설명합니다.
본 콘텐츠는 오락용입니다. 중요한 결정은 전문가와 상담하세요.