Java에서 날짜와 시간 계산을 하기 위한 클래스가 여럿 있습니다.
Date, Calendar, LocalDate, LocalDateTime ...
구글링하면 Date와 Calendar를 이용한 예제가 먼저 뜨곤 하는데요.
Date와 Calendar의 단점
Date와 Calendar 클래스에는 문제점들이 있습니다.
그래서 이미 Java 8 에서부터 많은 메서드가 deprecated 처리되었습니다.
안정성과 보안성
불변 객체가 아니기 때문에 안정성과 보안성이 떨어집니다.
Calendar calender = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2024);
예시와 같이 Calendar 객체로 얻어온 현재 시간과 날짜는 set() 을 통해 쉽게 변경 가능합니다.
만약 해당 객체를 다른 곳에서도 사용하는 중이었다면 의도치 않게 다른 값을 얻게 될 수 있습니다.
또 여러 스레드에서 날짜와 시간을 동시에 관리하는 경우에도 문제가 생깁니다.
사용성
사용하기 너무 불편합니다!!
Date로는 날짜를 계산하기 불편해서 Calendar가 추가되었기 때문에, 날짜를 관리하려면 두 객체를 모두 생성해야 합니다.
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
Date date = calendar.getTime();
현재 날짜에 하루를 더하기 위한 코드입니다. 굳이..?ㅠㅠ
Calendar에서 월을 나타내는 상수는 0부터 시작합니다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM")
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, 1);
System.out.println(sdf.format(calendar.getTime())); // 2023-02
1을 입력하면 2월이 되는 매직..!
다른 문제들도 많지만 어쨌든 결론은 이제 Date는 보내주자는 겁니다..!
개선된 클래스가 나왔으니까요ㅎㅎ
LocalDate, LocalDateTime
java.time 패키지에 추가된 LocalDate, LocalDateTime은 불변 객체입니다.
안정성과 보안성 문제가 없습니다.
또 날짜만 관리한다면 LocalDate, 시간까지 관리한다면 LocalDateTime을 쓰면 되기 때문에 불필요하게 다른 객체를 생성할 필요가 없습니다.
사용하기도 편합니다.
// 현재 날짜와 시간
LocalDateTime currentDateTime = LocalDateTime.now();
// 현재 날짜
LocalDate currentDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
System.out.println(currentDate.format(formatter)); // 20231208
// 하루 더하기
LocalDateTime tomorrow = currentDate.plusDays(1);
System.out.println(tomorrow.format(formatter)); // 20231209
결론
그냥 LocalDate, LocalDateTime 쓰세요!