'GMT'에 해당되는 글 1건

  1. 2009.01.06 Date, SimpleDateFormat
2009.01.06 12:21
java.util.Date는 날짜와 시간을 나타내기 위해 사용합니다.
이 클래스의 기본 생성자를 보면,
System.currentTimeMillis() 를 사용해서 초기화하고 있습니다.
System.currentTimeMillis() 를 보면,
http://java.sun.com/docs/glossary.html#N 를 보면 native keyword는 이 메소드가 자바가 아닌 다른 언어로 작성되었다는 것을 의미하는...
어쨌거나 milli second 정확도의 시간을 long값으로 반환하는데, 위에 나와있듯이 1970년 1월 1일 자정부터 현재시간과의 차이를 나타납니다.

일단 long값은 -9,223,372,036,854,775,808 에서 9,223,372,036,854,775,807 까지의 값을 가질 수 있으므로,
아래와 같이 해보면,
...

결과가 좀 아리까리합니다.
일단 Long.MAX_VALUE 값으로 테스트한 결과는 2억 9227만 8994년 까지 표현할 수 있음을 나타내고 있습니다.
인류가 2억년까지 멸종하지 않고 살아남을 수 있을까요. 일단 그때쯤 되면, 소형핵융합 엔진으로 우주 여행을 하고 있지 않을까 싶네요. 그정도면 자바는 이미 잊혀진 언어가 되있을테니 걱정할 필요는 없네요.
문제는 0과 Long.MIN_VALUE 값으로 테스트한 결과입니다.

먼저 0을 이용해 Date를 만들었더니, 1970년 1월 1일 9시로 나옵니다.
분명히 http://java.sun.com/javase/6/docs/api/java/util/Date.html 에는 January 1, 1970, 00:00:00 GMT 로 나와있는데요.
이것은 한국의 GMT offset이 +9 시간 이기 때문입니다. 그러니깐 아래와 같이 표준 시간대가 서울로 설정되어 있기 때문에 이렇게 표시해줍니다.


그리고 Long.MIN_VALUE 값의 결과에 대해 살펴보자면, 소스 코드를 봐야 하는데,
Date 클래스의 get 메소드는 getTime() 을 빼고는   사용하지 않게 되었기 때문에, SimpleDateFormat을 사용하고 있습니다. 이 SimpleDateFormat은 사용하기는 Simple하지만, 코드를 읽으려니, DateFormat을 extends하고 있고...

난  단지 단순히 음수를 어떻게 처리하고 있는지를 보고 싶을 뿐이고!
SimpleDateFormat코드는 2088 라인일 뿐이고!

어쨌든 쭉 따라가 보았습니다.
sdf.format(minDate) 에서 format(Date date) method는 DateFormat의 format(Date date) 인데 이 메소드는 abstract 메소드인 DateFormat 의 StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fiedlPosition)을 호출하고 있고 다시 이 메소드는 SimpleDateFormat에서 구현하고 있는데, 그 메소드가 다음 메소드입니다.
비스타 그림판에서 jpg로 저장하니 좀 뭉게지내요. 이 그림 위에껀 png,
어쨌건 다시
이 함수가 호출되고 있는데, 결국 SimpleDateFormat의 private method인 subFormat 메소드가 다시 호출됩니다.
근데 여기서 끝이 아니군요. 생각보다 더 복잡하네요. orz...나중에 시간있을 때 봐야 겠네요.

SimpleDateFormat 이 어떻게 돌아가는지는 무시하고,
SimpleDateFormat 을 이용하여 문자열로 변환할 수 있는 Date 혹은 long 값의 범위는 어디 까지 인가를 확인하기 위해서 long 값을 계속 줄여가면서 확인을 해보았습니다.

그 결과는 ..
0001-01-01 00:00:00.000 ( -62167424400000 ) 이 최소값입니다.
여기서 다시 -1을 하게 되면 날짜와 시간은 다시 증가하게 됩니다.
...
...?

결론!
  1. SimpleDateFormat은 0001-01-01 00:00:00.000 부터 제대로 표시할 수 있다.
  2. System.currentTimeMillis(), Date 등에서 사용되는 long값은 GMT offset이 0인 곳의 시각을 나타낸다.
- 추가
SimpleDateFormat 으로 문자열을 파싱할 때 알아둘 점이 있습니다.
위에 testStr 은 1월 32일을 의미하고 있습니다. ㅡㅡㅋ 그렇죠, 1월에는 32일이 없습니다.
제가 이 코드를 돌려본 이유는 날짜 규칙(1월은 31일까지 있다, 윤년 등등...)이 SimpleDateFormat에 구현되어 있는지 확인하기 위해서 입니다. 위 코드를 돌려보면,
위와 같이 2월 1일이 표시됩니다.
결과적으로 SimpleDateFormat은 ParseException 을 던지지 않았고, 2009년 1월 32일은 2월 1일로 제대로(?) 파싱된 것을 확인할 수 있습니다....
날짜 규칙을 확인하는 코드는 따로 구현해야겠네요.

Posted by 나야

댓글을 달아 주세요