깐죽이의 정보 바다

사주팔자 김선생 사주 보는 앱을 만들려면 양력 음력 변환 알고리즘이 필요합니다. 왜냐하면 10년지기 대운과 운이 바뀌는 시기는 24절기로 계산을 하는데 24절기는 12절기와 12중기가 이루어져 있으며 양력과 음력은 11일 차이가 나기 때문에 윤달을 두어 양력에 맞춥니다. 

 

이미 만세력 데이터 베이스에 양력이 표시 되지만 그래도 프로그램 알고리즘이 필요해서 함수로 만들었습니다. 

 

양력을 음력으로 변환하는 함수

 

반응형

 

양력을 음력으로 변환해주는 함수 윤달표시

	Function gf_Lun2Sun($GF_YEAR , $GF_MONTH , $GF_DAY){

		$year	= $GF_YEAR;
		$month = $GF_MONTH;
		$day		= $GF_DAY;
        $LUNAR_LAST_YEAR = 1939;

        $lunarMonthTable = array(
            array(2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2),   /* 양력 1940년 1월은 음력 1939년에 있음 그래서 시작년도는 1939년*/
            array(2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1),
            array(2, 2, 1, 2, 2, 4, 1, 1, 2, 1, 2, 1),   /* 1941 */
            array(2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2),
            array(1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2),
            array(1, 1, 2, 4, 1, 2, 1, 2, 2, 1, 2, 2),
            array(1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2),
            array(2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2),
            array(2, 5, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2),
            array(2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2),
            array(2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2),
            array(2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1),
            array(2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2),   /* 1951 */
            array(1, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 2),
            array(1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2),
            array(1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2),
            array(2, 1, 4, 1, 1, 2, 1, 2, 1, 2, 2, 2),
            array(1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2),
            array(2, 1, 2, 1, 2, 1, 1, 5, 2, 1, 2, 2),
            array(1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2),
            array(1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1),
            array(2, 1, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1),
            array(2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2),   /* 1961 */
            array(1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1),
            array(2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 1),
            array(2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2),
            array(1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2),
            array(1, 2, 5, 2, 1, 1, 2, 1, 1, 2, 2, 1),
            array(2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2),
            array(1, 2, 2, 1, 2, 1, 5, 2, 1, 2, 1, 2),
            array(1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1),
            array(2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2),
            array(1, 2, 1, 1, 5, 2, 1, 2, 2, 2, 1, 2),   /* 1971 */
            array(1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1),
            array(2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1),
            array(2, 2, 1, 5, 1, 2, 1, 1, 2, 2, 1, 2),
            array(2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2),
            array(2, 2, 1, 2, 1, 2, 1, 5, 2, 1, 1, 2),
            array(2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1),
            array(2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1),
            array(2, 1, 1, 2, 1, 6, 1, 2, 2, 1, 2, 1),
            array(2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2),
            array(1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2),   /* 1981 */
            array(2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2, 2),
            array(2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2),
            array(2, 1, 2, 2, 1, 1, 2, 1, 1, 5, 2, 2),
            array(1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2),
            array(1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1),
            array(2, 1, 2, 2, 1, 5, 2, 2, 1, 2, 1, 2),
            array(1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1),
            array(2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2),
            array(1, 2, 1, 1, 5, 1, 2, 1, 2, 2, 2, 2),
            array(1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2),   /* 1991 */
            array(1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2),
            array(1, 2, 5, 2, 1, 2, 1, 1, 2, 1, 2, 1),
            array(2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2),
            array(1, 2, 2, 1, 2, 2, 1, 5, 2, 1, 1, 2),
            array(1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2),
            array(1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1),
            array(2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2, 1),
            array(2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1),
            array(2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1),
            array(2, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2),   /* 2001 */
            array(2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1),
            array(2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2),
            array(1, 5, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2),
            array(1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1),
            array(2, 1, 2, 1, 2, 1, 5, 2, 2, 1, 2, 2),
            array(1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2),
            array(2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2),
            array(2, 2, 1, 1, 5, 1, 2, 1, 2, 1, 2, 2),
            array(2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2),
            array(2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1),   /* 2011 */
            array(2, 1, 6, 2, 1, 2, 1, 1, 2, 1, 2, 1),
            array(2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2),
            array(1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1, 2),
            array(1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1),
            array(2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2),
            array(2, 1, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2),
            array(1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2),
            array(2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2),
            array(2, 1, 2, 5, 2, 1, 1, 2, 1, 2, 1, 2),
            array(1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1),   /* 2021 */
            array(2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2),
            array(1, 5, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2),
            array(1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1),
            array(2, 1, 2, 1, 1, 5, 2, 1, 2, 2, 2, 1),
            array(2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2),
            array(1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2),
            array(1, 2, 2, 1, 5, 1, 2, 1, 1, 2, 2, 1),
            array(2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2),
            array(1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1),
            array(2, 1, 5, 2, 1, 2, 2, 1, 2, 1, 2, 1),   /* 2031 */
            array(2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2),
            array(1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 5, 2),
            array(1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1),
            array(2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2),
            array(2, 2, 1, 2, 1, 4, 1, 1, 2, 2, 1, 2),
            array(2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2),
            array(2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1),
            array(2, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1, 1),
            array(2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1),
            array(2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2),   /* 2041 */
            array(1, 5, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2),
            array(1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2));


        // 양력의 달마다의 일수
        $solMonthDay = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

		/* range check */
		if ($year < 1940 || $year > 2040) {
			alert('1940년부터 2040년까지만 지원합니다');
			return;
		}

		/* 속도 개선을 위해 기준 일자를 여러개로 한다 */
		if ($year >= 2000) {
			/* 기준일자 양력 2000년 1월 1일 (음력 1999년 11월 25일) */
			$solYear = 2000;
			$solMonth = 1;
			$solDay = 1;
			$lunYear = 1999;
			$lunMonth = 11;
			$lunDay = 25;
			$lunLeapMonth = 0;

			$solMonthDay[1] = 29;    /* 2000 년 2월 28일 */
			$lunMonthDay = 30;   /* 1999년 11월 */
		}
		else if ($year >= 1970) {
			/* 기준일자 양력 1970년 1월 1일 (음력 1969년 11월 24일) */
			$solYear = 1970;
			$solMonth = 1;
			$solDay = 1;
			$lunYear = 1969;
			$lunMonth = 11;
			$lunDay = 24;
			$lunLeapMonth = 0;

			$solMonthDay[1] = 28;    /* 1970 년 2월 28일 */
			$lunMonthDay = 30;   /* 1969년 11월 */
		}
		else {
			/* 기준일자 양력 1940년 1월 1일 (음력 1939년 11월 22일) */
			$solYear = 1940;
			$solMonth = 1;
			$solDay = 1;
			$lunYear = 1939;
			$lunMonth = 11;
			$lunDay = 22;
			$lunLeapMonth = 0;

			$solMonthDay[1] = 29;    /* 1940 년 2월 28일 */
			$lunMonthDay = 29;   /* 1939년 11월 */
		}

		$lunIndex = $lunYear - $LUNAR_LAST_YEAR;
		
		// 반복문이 돌면서 양력 값들과 음력 값들을 1일 씩 증가시키고
		// 입력받은 날짜값과 양력 값이 일치할 때 음력값을 반환함
		while (true) {
			if (	$year == $solYear &&
				$month == $solMonth &&
				$day == $solDay) {

				$year = $lunYear;
				$month = $lunMonth;
				$day = $lunDay;

				break;
			}

//			echo $solMonthDay[$solMonth - 1].":".$solYear.":".$solMonth.":".$solDay.":".'<br>';

			// 양력의 마지막 날일 경우 년도를 증가시키고 나머지 초기화
			if ($solMonth == 12 && $solDay == 31) {
				$solYear++;
				$solMonth = 1;
				$solDay = 1;

				// 윤년일 시 2월달의 총 일수를 1일 증가
				if ($solYear % 400 == 0)
					$solMonthDay[1] = 29;
				else if ($solYear % 100 == 0)
					$solMonthDay[1] = 28;
				else if ($solYear % 4 == 0)
					$solMonthDay[1] = 29;
				else
					$solMonthDay[1] = 28;
			}
			// 현재 날짜가 달의 마지막 날짜를 가리키고 있을 시 달을 증가시키고 날짜 1로 초기화
			else if ($solMonthDay[$solMonth - 1] == $solDay) {
				$solMonth++;
				$solDay = 1;
			}
			else
				$solDay++;

			// 음력의 마지막 날인 경우 년도를 증가시키고 달과 일수를 초기화
			if ($lunMonth == 12 &&
				(($lunarMonthTable[$lunIndex][$lunMonth - 1] == 1 && $lunDay == 29) ||
					($lunarMonthTable[$lunIndex][$lunMonth - 1] == 2 && $lunDay == 30))) {
				$lunYear++;
				$lunMonth = 1;
				$lunDay = 1;

				if ($lunYear > 2043) {
					alert("입력하신 달은 없습니다.");
					break;
				}

				// 년도가 바꼈으니 index값 수정
				$lunIndex = $lunYear - $LUNAR_LAST_YEAR;

				// 음력의 1월에는 1 or 2만 있으므로 1과 2만 비교하면됨
				if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 1)
					$lunMonthDay = 29;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 2)
					$lunMonthDay = 30;
			}
			// 현재날짜가 이번달의 마지막날짜와 일치할 경우
			else if ($lunDay == $lunMonthDay) {

				// 윤달인데 윤달계산을 안했을 경우 달의 숫자는 증가시키면 안됨
				if ($lunarMonthTable[$lunIndex][$lunMonth - 1] >= 3 && $lunLeapMonth == 0) {
					$lunDay = 1;
					$lunLeapMonth = 1;
				}
				// 음달이거나 윤달을 계산 했을 겨우 달을 증가시키고 lunLeapMonth값 초기화
				else {
					$lunMonth++;
					$lunDay = 1;
					$lunLeapMonth = 0;
				}

				// 음력의 달에 맞는 마지막날짜 초기화
				if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 1)
					$lunMonthDay = 29;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 2)
					$lunMonthDay = 30;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 3)
					$lunMonthDay = 29;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 4 && $lunLeapMonth == 0)
					$lunMonthDay = 29;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 4 && $lunLeapMonth == 1)
					$lunMonthDay = 30;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 5 && $lunLeapMonth == 0)
					$lunMonthDay = 30;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 5 && $lunLeapMonth == 1)
					$lunMonthDay = 29;
				else if ($lunarMonthTable[$lunIndex][$lunMonth - 1] == 6)
					$lunMonthDay = 30;
			}
			else
				$lunDay++;

			$youn = ($leapMonth <= 0) ? '(윤)' : '';
		}


		return "음력 " . $year . "년 "  . $youn . $month . '월 ' . $day;
	}


	function alert($msg) {
		echo $msg;
	}

//사용예시
	echo gf_Lun2Sun(2023, 3, 30);

 

양력 1940년 1월은 음력 1939년에 있습니다. 시작년도는 1939년 끝나는 년도는 2043까지 맟춰져있습니다. 속도 개선을 위해 기준일자를 여러개 두어 빠르게 계산할수 있도록 했습니다. 

 

함께 보면 좋은 정보

 

2023년 손없는 날과 집수리, 이사, 이장, 수의 좋은날 윤달 정리

우리나라 세시 풍속 중에는 설날, 추석, 정월대보름, 한식, 단오 등 많은 풍속이 있는데요. 사주에서 윤달과 손없는날은 매우 많은 의미를 부여합니다. 손 없는 날에 손은 사람의 활동을 방해하

kimkkanjuk.tistory.com

 

 

리눅스(centos) APM(Apache/PHP/MySQL) 설치하기

리눅스에 APM을 설치하기 앞서 버전별로 호환하는게 달라 리눅스 명령어로 버전을 확인해보자. 1. 현재 설치하고자 하는 OS 와 버전확인 하기 설치 OS 와 버전 Centos 7 ▶ OS버전확인하기 리눅스 OS

kimkkanjuk.tistory.com

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band shouturl