microtime 의 비밀, microtime을 로컬타임으로 변환하기.

오늘은 Microtime 에 대해서 이야기 해봐야겠당. 사실 나도 정확히 요놈에 대해 알지 못한다. 그런데 오늘 이놈 때문에 삽질을 한게 있어서 적고 넘어간다. 사실 내가 하고 싶었던건, zeroboard에서 reg_date로 들어가 있는 날짜를 jsp에서 불러와 출력하고 싶었다. 내가 검색 능력이 딸려서 못찾은건지, php에서는 기본 함수로 있는데.. jsp에서는 microtime을 현재 시간으로 변환해주는 메소드를 찾지 못했다.

여기저기 Q/A를 뒤져봤지만.. 못찾았다.. 그래서 그냥 나몰라라 접어두고 있었는데.. 오늘 마침 TDD(테스트 주도개발) 연습을 하면서 날짜를 컨트롤하는 예제를 뚝딱뚝딱 하고 있었다. 그래서 이왕 하는 김에 DateTime  클래스를 java로 구현해봤다. 이놈의 역할은 간단하다. microtime 을 인자로 받아서 현재시간으로 출력해주기위한 클래스다. 이것을 구현하기 위해 microtime을 다시 찾아봤다.

검색 결과에 의하면, microtime은 100/1 초까지 유닉스시간형태로 반환을 해준다고 한다. 기준은 1970년 1월 1일 0시 ㅇ분 00초를 부터 시작이다. 중요한건 1970년 1월 1일 0시 00분 00초가 기준이라는것이다. 아마도 1970년도가 유닉스 탄생해가 아닌가하는 추측해본다. 물론 찾아보지 않았다..귀찮아서..( 누군가 유닉스 탄생시기를 알려주겠지?~ ㅎㅎ)

다시 본론으로 돌아와서 zeroboard 의 reg_date는 mysql에 int(13)으로 잡혀있다. 실제로 값을 불러오면, 10자리 숫자가 나온다. 추측해보건데,.. 이 10자리 숫자를 환산하면, 0000년 00월 00일 00시 00분 00초로 나올것이다. 마침 32비트 컴퓨터의 int형 범위도 대략 10자리수가 나온다. 여기서 재밌는 사실을 알아냈다. microtime의 유효범위가 2037년쯤 된다고 한다. 만약에 2037년이 지나면, 이상해 진다고 하던데.. 아마도 그 이유는 int 범위에 굉장히 밀접한 관계가 있지 싶다.

시간을 계산해 보면,
1분은 60초,
1시간은 3600초,
하루는 86400초,
한달은 날짜마다 계산이 다르다.
단, 1년은 365일이고, 윤년일 경우 1년은 366일..
즉, 1년은 31536000초이고, 윤년인 해일 경우엔, 31622400초가 된다.

int의 최대범위는 2147483647 이고, 이것을 평년으로 나누면,..대략 68년이 나온다. 그러므로 1970년을 기준으로하면 2038년이 딱떨어진다. ㅋㅋㅋ 이것으로, 마이크로타임은 32비트 컴에서 내부적으로 int형 4바이트로 구현되어 있음을 짐작 할수있다. 이미 microtime을 로컬타임으로 변환하기 위한, 모든 아이디어는 앞에 서술한거 같다.

다시한번 짚어보면,
윤년을 계산해 내야하고,
날짜를 계산해 내기 위해, 달별로 일수를 짚어내야한다.
물론 윤년이 낀 해의 2월은 29일이다.
요 날짜만 구해낸다면, 시간은 식은죽먹기~!
시간구할때 한가지 더 생각해봐야할껀 로컬타임..
우리나라의 경우 +9 시간을 해야한다.

그밖에

TDD 연습을 위한 페이지