0. 날짜 & 시간 API
👉 자바에서는 날짜, 시간을 다루는 클래스들이 있다.
나는 보통 DateUtil 을 많이 썼고, Calendar 클래스는 써본 기억이 거의 없다.
그러던 도중 배치 작업 수정사항이 생겨 해당 날짜에 23시 59분 59초를 구하는 방법에 대해 찾아보면서 JDK8부터 추가된 java.time 에 대해서 알아볼 수 있었다.
1. Calender , Date 클래스의 문제점
찾아보니 Calender 클래스와 Date 클래스에는 문제점이 많았다. 사실 날짜를 구할일이 많이 없었어서 내가 느껴보지 못하고 찾아볼 생각을 잘 안했던 것 같다..ㅎ
- 불변 객체가 아니다.
- 상수 필드를 남용한다.
- 헷갈리는 월 지정 방식이다.
- 일관성이 없는 요일 상수이다. (일요일의 기준이 0, 1)
- Date와 Calender 객체의 역할 분담
- java.util.Date 하위 클래스의 문제
JAVA에서 날짜,시간 제대로 사용하는 LocalDate, LocalTime, LocalDateTime (NTP 시간 서버에서 정확한 시간
아직도 Calendar, Date 사용하니? 자바에서 아직도 Calendar.getInstance해서 시간/날짜를 표현하는 프로그래머가 있을까?처음 공부할 때나 단순하게 표현해야할 때는 사용할 수 있지만 단점이 극명한 클
jeong-pro.tistory.com
2. java.time 패키지는?
java.time 패키지의 특징은 하루를 86400초만 계산하고 공식시간만을 사용한다는 점이다.
java.time (Java Platform SE 8 )
Class Summary Class Description Clock A clock providing access to the current instant, date and time using a time-zone. Duration A time-based amount of time, such as '34.5 seconds'. Instant An instantaneous point on the time-line. LocalDate A date withou
docs.oracle.com
사실 여러 블로그에 정리되어있는 글도 찾아보았지만 제일 정확하고 설명이 쉬운 문서가 API 공식문서이지 않을까 싶어 찾아보았다.
자세한 내용은 API 문서를 보면 좋을 것 같다.
3. 내가 사용한 문법
내가 출력해야 하는 시간은 "매일 자정 12시에 전날 23:59:59 에 해당하는 목록" 을 뽑아야하기 때문에, 배치가 도는 전날기준으로 23시 59분 59초를 출력해야한다.
순서를 정리해보면,
현재 날짜 기준 전날 날짜에 해당하는
23시 59분 59초 의 시간을 출력하면 된다.
① 현재 날짜 출력
☝ 현재 날짜를 먼저 출력하려면 LocalDateTime.now() 메서드를 사용하여 출력할 수 있다.
② 기준 전날 날짜 출력
✌ 현재 날짜를 기준으로 전날을 출력하려면 LocalDateTime.minusDays() 메서드를 통하여 출력 할 수 있다.
(days, hours, minutes, months, nanos, seconds, weeks, years 등 다양하게 있으니 목적에 맞게 사용하면 좋을 것 같다.)
(LocalDateTime.minus* 뿐 아니라 plus도 있고, get도 있으니 참고하면 될 것 같다!)
③ 시간 세팅 (MAX)
🤞 그 후 해당 시간에 대한 복사본을 반환하는 메서드를 이용하여 시간을 세팅 후 반환하도록 한다.
그 중 내가 사용한 부분을 보자면 나는 LocalTime.MAX 를 통하여 23시 59분 59초의 시간을 출력해낼 수 있었다.
MAX 말고도 MIDNIGHT, MIN, MOON 에 해당하는 시간을 출력할 수 있게 되어있다.
④ 원하는 format 으로 출력
시간을 다 구했다면, 원하는 format 으로 출력하기 위한 작업이 필요하다.
🖖 나는 YYYYMMDDHHMMSS format 으로 출력해주기 위해
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.KOREA);
라는 formatter 를 생성 후 format() 메서드를 통하여 출력하였다.
내가 원하는 날짜를 뽑기 위한 코드이다.
String date = LocalDateTime.now().minusDays(1).with(LocalTime.MAX).format(formatter);
이렇게 API 공식 문서를 참고해가며 메서드를 사용해본건 거의 처음인 것 같다. 더 다양한 문법도 존재하니 찾아가면서 사용해보는 것에 초점을 맞춰 학습이 필요한 것 같다ㅜ