RedCrow + GreenBean

Feed Rss

PHP mktime 만들기 (윤년 계산 ㅠㅜ)

12.18.2012, PHP, by .

카페를 다니다가 아두이노를 위해 mktime를 만든것을 보았다.

그래?

나도 한번 해볼까?

하고 만들어 볼려고 했는데…

집에 컴퓨터가 없네… ^^;

늦게 마치는 바람에 노트북을 회사에 두고 나왔다.

집에가서 A4용지 하나에 그냥 끄적여 보았다.

그리고 회사에서 우선 PHP로 구현해보았다.

음…

잘되는군…

크게 복잡할건 없다.

기준일로부터 지금까지의 초만 구하면 된다. ^^;

헌데 몇가지 걸리적 거리는게 윤년이다.

지구의 공전주기는 우리가 알고 있는 1년이다.

헌데 이게 정확히 365일이 아니다.

처음 율리우스 시대에 공전주기를 계산하니 365.25일이 나왔던 것이다.

그래서 4년마다 하루씩 윤년을 두어 2월 29일까지 두게 된것이다.

하지만 나중에 좀더 정확한 공전주기가 나오고 365.2422일인것이 확인되면서 100년에 한번 윤년을 쉬고(이때는 2월달이 28일까지만 있다.) 그중 400년이 되는 때마다 윤년을 더하게 되었다.

이렇게 함으로써 실제 공전주기와 최대한 같도록 만들었으며 위 계산식이라면 365.2425일이 나와서 365.2422일과는 0.0003일이 차이가 난다.

하지만 3333년에 1일의 차이임으로 아직까지는 크게 걱정하지 않아도 된다.

로마 교황 그레고리우스 13세가 1582년 10월 4일(목) 다음날을 10월 15일(금)로 바꾼것에 비하면 괜찮은 계산법이다.

뭐 간단하게 보이기도 하고 조금 복잡하게 보이기도 한다.

윤년 계산만 잘 하면 크게 문제가 없다.

윤년을 다시 정의 해보면

 

4년마다 윤년이다.

100년마다 윤년으로 치지 않는다.

400년마다일때는 윤년으로 친다.

 

아~

이런 정리해도 복잡… ㅠㅜ

 

php에서 mktime은 1970년 1월 1일 0시 0분 0초 부터 시작된다.

위 시간이 0이다.

1970년 1월 1일 0시 0분 1초가 1이다.

이렇게 해서 지금까지 총 몇초인가를 계산한다.

그럼 1970년부터 구하는 년까지 몇년이 있는지 확인하고

해당 월까지 몇개월이 있으면 각 월마다 날짜가 몇까지 있는지 확인 해야 한다.

그리고 일, 시, 분, 초를 계산하면 된다.

일, 시, 분, 초는 크게 문제가 안되지만 년, 월이 문제다.

년은 중간 중간에 윤년이 있는지 확인해서 윤년 계산을 해줘야 한다.

평년은 365일이지만 윤년은 366일이기 때문이다.

그리고 월의 계산역시 각 월마다 마지막 날이 다르기 때문이다.

특히나 윤년이 있는 해면 그것도 계산해야 한다.

뭐 이래저래 머리 굴려서 만든 소스이다.

동작 잘한다.

중간중간에 애를 먹긴 했지만…. ^^;

약간의 주석으로 다른 분들이 봐도 알지 않을까 싶다.

실수한것들까지 다 넣고 싶었지만… ^^; 부끄러워서~

테스트 하는 내용에도 있듯이 한국시 표준으로는 php의 mktime이 2038년 1월 19일 12시 14분 7초까지만 동작한다.

그 상태에서 1초라도 추가가 되면 1901년 12월 14일 5시 45분 52초로 표시가 된다.

1970년 1월 1일 0시 0분 0초 이전은 -값을 가지면서 그 이상은 동작을 하지 않다니…

변수의 한계 때문인가?

암튼 그러한 새로운 점도 알게 되었다.

우선 내가 구현한 mktime은 1970년 이전의 경우는 0을 반환한다.

물론 모두 숫자만 가능하고, 아니면 0을 반환, 년, 월, 일, 시, 분, 초도 각각 해당 범위의 숫자만 가능하다.

특히 일의 경우 최대 날짜가 다르기 때문에 월별 일수를 배열로 만들고 또 특히 2월의 경우 윤년 여부에 따라서 28일 혹은 29일이 된다.

년과 월만 윤년에 맞춰 잘 계산하면 나머지는 뭐 그저 초만 계산해주면 문제없이 해결된다.

mktime처럼 기타 구현 기능까지 생각해봐야 겠다.

이제 이걸 아두이노에서 쓸 수 있게 적용을 해봐야 겠다.

3 Responses to PHP mktime 만들기 (윤년 계산 ㅠㅜ)

  1. 2015-11-30 at 22:30 노영주

    안녕하세요 당근이 카페에서 날짜돌아가기 질문했던 학생이에요!!
    혹시 저기위에 24번째줄에 숫자일 경우에만이 무슨뜻인지 알수있을까요??

    응답
    • 2015-11-30 at 22:45 redcrow

      함수를 만들면서 예외처리를 한겁니다
      날짜 민드는 함수인데 숫자가 아닌 문자가 들어왔을때 오류를 발생시킬게 아니라 잘못 넣었습니다
      라고 알리기 위함입니다

      저도 잘 안들어가는 블로그에 오셔서 질문까지 해 주시고…
      감사합니다

      응답
      • 2015-11-30 at 23:00 노영주

        아니에요 제가더 감사드려요!!
        이렇게 링크도걸어주시고 친절히 설명도 해주셔서요!!

        응답

노영주에게 댓글 남기기 댓글 취소

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다