JAVA/JAVA8 관련
Date 와 Time 소개
JUMP개발자
2022. 5. 15. 14:56
자바 8에 새로운 날짜와 시간 API가 생긴 이유
Date 클래스의 문제
1. 그전까지 사용하던 java.util.Date 클래스는 mutable 하기 때문에 thead safe하지 않다.
2. 클래스 이름이 명확하지 않다. Date인데 시간까지 다룬다.
3. 버그 발생할 여지가 많다. (타입 안정성이 없고, 월이 0부터 시작한다거나..)
4. 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤했다.
1. Mutable하여 Thread Safe하지 않은 부분
public class DateThread {
public static void main(String[] args) {
Date date = new Date();
long time = date.getTime();
System.out.println("date :: " + date);
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date after5Sec = new Date();
System.out.println("after5Sec" + after5Sec);
after5Sec.setTime(time);
System.out.println("after5Sec" + after5Sec);
}
}
최초 코드 실행 후 5초 후에 다시 Date 객체를 생성하여 출력하였습니다.
setTime 메서드를 통해 보면 기존에 생성한 객체의 경우 생성할 당시의 시간이 출력됨을 알 수있습니다.
2. 클래스 이름의 명확하지 않다.
Date 클래스의 경우 날짜 외에 TimeStamp 범위까지 다룬다.
그리고 일반적인 시간값이 아닌 epoch Time을 가져온다.
3. 버그 발생할 여지가 많다. (타입 안정성이 없고, 월이 0부터 시작한다거나..)
Calendar date = new GregorianCalendar(1989, 5, 23);
위와 같이 Calendar를 생성하면 1989년 6월 23일을 의미한다.
GregorainCalendar에서는 Month를 0부터 시작하기때문이다.
4. 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤했다.
주요 API 특징
기계용 시간(machine time)과 인류용 시간(human time)으로 나눌 수 있습니다.
•
기계용 시간은 EPOCK(1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표시합니다.
•
인류용 시간은 우리가 흔히 사용하는 연,월,일.,시,분,초 등을 말합니다.
•
타임스탬프는 Instant를 사용합니다.
특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)를 사용할 수 있습니다.
•
기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)를 사용할 수 있습니다.
•
DateTimeFormatter를 사용해 일시를 특정한 문자열로 포매팅 할 수 있습니다.