반응형

출처:

http://stackoverflow.com/questions/4042817/java-calendar-problem-why-are-these-two-dates-not-equal


자바의 정석 연습문제를 푸는 도중 분명히 같은 날짜를 입력했는데도 자꾸 다르다고 나왔다.

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
		
c1.set(2014, 10, 28);
c2.set(2014, 10, 28);

if (c1.equals(c2)) {
    System.out.println("날짜가 같습니다.");
} else {
    System.out.println("날짜가 다릅니다.");
}

그러니까 위 코드에서 날짜가 다르다고 결과를 뱉는 것이었다.

왜 안 되는가 하고 계속 찾아보고 생각해보다가 알게된 것은 문제의 원인은

Calander 인터페이스의 MILLISECOND 변수였다.


Calander 인터페이스는 인스턴스 생성후 날짜 값을 받을 때 받지 않은 값은 현재 것을 사용한다.

지금 위의 코드에서는 년, 월, 일을 설정했으므로

나머지 시간값은 컴퓨터에서 자동으로 잡아주는 것이다.

문제는 이 시간들 중 밀리세컨드 단위도 존재한다는 것이다.


다른 값은 컴파일할 때 바꿔질만큼 작은 값이 아니라서 안 바뀌지만,

밀리세컨드는 충분히 작은 단위이기 때문에 바뀐다는 것을 고려해야 한다.


C에서 사용하던 타임 함수를 떠올려보면 아마도 이해가 될 것이라고 생각한다.

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
		
c1.set(2014, 10, 28);
c2.set(2014, 10, 28);

c1.clear(Calendar.MILLISECOND);
c2.clear(Calendar.MILLISECOND);

if (c1.equals(c2)) {
    System.out.println("날짜가 같습니다.");
} else {
    System.out.println("날짜가 다릅니다.");
}


다시 돌아와서 이 코드에서 날짜가 제대로 같게 나올려면 다음과 같이 안 쓰는 값은 초기화 해야 한다.

이 코드에서는 밀리세컨드 값만 초기화 했지만

다른 시간값도 변경될 것을 대비한다면 다른 값도 초기화 하는 것이 좋을 것이다.

반응형
Posted by 애콜라이트
l

free counters