
✅ 사주 알고리즘, 어디서부터 시작했을까?
사주팔자(四柱八字)를 구성하기 위해선 연, 월, 일, 시의 간지를 정확하게 계산해야 합니다.
이 계산은 단순히 날짜만으로는 해결되지 않고, 절기, 시간 단위, 간지 순환 규칙 등 복합적인 요소를 고려해야 하죠.
저는 이전에 Python으로 구현된 알고리즘을 기반으로 사주 계산 로직을 PHP로 옮기는 작업을 시작했습니다.
그러나 언어 간의 차이와 천문력 구조에 따른 계산 기준 차이 때문에 그냥 옮기기만 해선 안 되었습니다.
🧠 사주 계산을 위한 기본 규칙 정리
기둥 | 기준 |
---|---|
년주 | 입춘 기준으로 해가 바뀜 |
월주 | 각 절기(입춘, 경칩, 청명 등) 기준으로 월이 바뀜 |
일주 | 양력 기준 일자에 따라 고정된 간지 |
시주 | 일간 기준으로 시간마다 바뀜 (2시간 단위) |
🔁 60갑자 배열 구현
사주 계산의 핵심은 10간 + 12지의 조합인 60갑자 배열입니다.
Python에서는 리스트로 구성했는데, PHP에서는 배열로 정적으로 작성하였습니다.
1 2 3 |
private $sixty_ganzhi = [ "갑자", "을축", "병인", ..., "계해" // 총 60개 ]; |
💡 배열의 순서가 조금만 틀려도 전체 사주 계산이 엉망이 되므로, Python의 리스트와 100% 동일한 순서로 구성해야 했습니다.
⚙️ 실제 간지 계산 함수 구성 (PHP)
1. 연간지 (년주)
1 2 3 4 5 6 7 8 9 10 |
private function adjust_year_ganzhi($date) { $solar_terms = $this->fetchSolarTerms((int)$date->format('Y')); $ipchun = new DateTime($date->format('Y') . '-' . $solar_terms['입춘']); // 입춘 이전이면 전년도 $year_for_gz = $date < $ipchun ? (int)$date->format('Y') - 1 : (int)$date->format('Y'); // DB에서 해당 연도의 year_ganzhi 조회 ... } |
2. 월간지 (월주)
1 2 3 4 5 6 7 8 9 |
private function adjust_month_ganzhi($date) { $solar_terms = $this->fetchSolarTerms((int)$date->format('Y')); $term_order = ["입춘", "경칩", ..., "소한"]; $month_index = ... // 절기 비교로 월 구하기 $base_index = array_search("무자", $this->sixty_ganzhi); $total_months = (($date->format('Y') - 1901) * 12) + $month_index + 1; return $this->sixty_ganzhi[($base_index + $total_months) % 60]; } |
🛠️ 파이썬과 PHP의 차이에서 발생한 문제들
1. % 연산자 차이
- Python: 음수도 순환 잘 됨
- PHP: 음수 나머지 연산 시 예상치 못한 값 발생
💡 해결: ($index + 60) % 60
처럼 항상 양수로 보정
2. 월운 간지 오차
월운이 실제 만세력과 다르게 출력되는 문제 발생. 확인 결과, 기준 연도를 출생년도로 잘못 사용하고 있었음.
1 |
$wolwoon = $this->calculateWolwoon((int)date('Y')); // ✅ 수정된 버전 |
📅 월운 계산 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private function calculateWolwoon($year){ $base_index = array_search("기축", $this->sixty_ganzhi); // 기준: 1901년 1월 $total_months = ($year - 1901) * 12; $wolwoon = []; for($i = 0; $i < 12; $i++) { $index = ($base_index + $total_months + $i) % 60; $wolwoon[] = [ "month" => $i + 1, "gz" => $this->sixty_ganzhi[$index] ]; } return $wolwoon; } |
🔄 대운, 세운 계산도 구현
대운은 월간지를 기준으로, 10년 단위 간지 흐름을 계산합니다.
세운은 현재부터 10년간의 연도별 간지를 나열합니다.
이들도 역시 60갑자 순환 배열과 % 계산을 기반으로 구현했습니다.
✅ 마무리
2편에서는 Python 기반의 사주 계산 로직을 PHP로 변환하면서 겪은 시행착오와 주요 구현 내용을 공유했습니다.
- 간지 배열 순서 오류는 절대 피해야 함
- 절기 기준 날짜·시각이 핵심
- Python과 PHP의 % 계산 차이 주의
- 월운은 출생연도가 아니라 “보려는 해” 기준으로 계산해야 함
📌 다음 편 예고
👉 [3편] 사용자 입력부터 결과 출력까지 – 완성 및 배포