날자를 관리하기 위해 java에서 사람들은 뭘 많이 사용할까?
무엇이 다르길래 사람들은 다른 객체를 생성할까에 대한 고민이 들었다.
일단 GPT에 물어보면 java.time 패키지에 속한
LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant
그리고 java8 이후에는 java.time 패키지를 이전에는 java.util.Date와 java.util.Calendar를 사용했다고 한다.
java.util에 속한 Date, Calendar는 자바의 정석을 통해 접한적이 있다.
time 패키지는 뭘까?
java 8 부터 dates, times, instatns, durations을 처리하기 위해 추가된 패키지다. 8, 11, 17을 비교해보았는데 메인 클래스의 변동은 java17에서 DateTimeExcpetion, DayOfWeek, InstantSource 이 추가 되었다.
경로는 java
참고 : java 17 doc
메인클래스를 일단 조금 직관적으로 예시와 붙여보자.
보기 전에 알면 좋은 개념 : ISO(International Organization for Standardization)
java 17 에서는 ISO-8061를 기본으로 선택하고 있음.
| Class | 설명 |
|---|---|
| Clock | 현재 시간을 제공(시간대 별), 시간을 조작, 표시 |
| Duration | time을 묵어서 표시 34.5초 |
| Instant | 시간을 표현하기 위한 객체 |
| LocalDate | 예) 2007-12-03 |
| LocalDateTime | 예) 2007-12-03T10:15:30. |
| LocalTime | 예) 10:15:30 |
| Month | 예) July |
| MonthDay | 예) 12-03 |
| OffsetDateTime | DateTime에 UTC와의 차이를 표현, 예) 2007-12-03T10:15:30+3:00. |
| OffsetTime | Time표현에 UTC와의 차이를 표현 예) 10:15:30+1:00. |
| Period | 날차간 차이표현, 예)'2 years, 3months and 4days' |
| Year | 예) 2007 |
| YearMonth | 예) 2007-12 |
| ZonedDateTime | 예) 2007-12-03T10:15:30+01:00 Europe/Paris. |
| ZoneId | 예) Europe/Paris. |
| ZoneOffset | 예) +02:00 |
내가 코딩한 프로그램을 실행하면 결국 시간을 확인할 수 있다.
결국 java에서 내가 한국에서 사용중인걸 알고 시간을 셋팅했다는 뜻이다.
기본값을 유동적으로 어떻게 바꿀수 있는가?
Zone의 내부를 조금 보자 public static ZoneId systemDefault()은 TimeZone.getDefault()를 쿼리한다.
엥? TimeZone?
그래서 TimeZone.getDefault()의 역할은? 뭐냐
JVM이 구동되는 운영체제(시스템)에서 지정된 시간을 가져오는 메소드다.
java에서 시간기본값은 어떻게 지정되는가?
JVM에서 시스템 설정 된 시간을 가져와 사용한다.(지역정보 포함)
시간대 설정이 필요하다면? window 시간설정
java.time.<제목>의 몇가지 패키지가 더 있는데 이건 왜있지?
chrono : 캘린더 시스템을 위한 api
format : dates와 times를 parse해서 출력을 제공
temporal : 필드별 시간 조작
zone : 시간대 규칙과 관련된 조작
결국 지금단계에서 내게 필요한 것은 년-월-일 단위로 기간을 지정하고,
새로운 날짜가 해당 기간안에 들어가는 지 확인하기 위해서다.
public class EventChecker {
private static final LocalDate startDate = LocalDate.of(2023,12,1);
private static final LocalDate endDate = LocalDate.of(2023,12,31);
public [static] boolean eventCheker(LocalDate dateToCheck) {
return !dateToCheck.isBefore(startDate) &&
!dateToCheck.isAfter(endDate);
}
}
요론식으로 사용하면 될것 같다.