Java 에서 날짜를 다뤄야 한다면

사당동씩씩이·2023년 11월 12일
post-thumbnail

날자를 관리하기 위해 java에서 사람들은 뭘 많이 사용할까?
무엇이 다르길래 사람들은 다른 객체를 생성할까에 대한 고민이 들었다.

Step1. 리스트업

일단 GPT에 물어보면 java.time 패키지에 속한
LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant
그리고 java8 이후에는 java.time 패키지를 이전에는 java.util.Date와 java.util.Calendar를 사용했다고 한다.

java.util에 속한 Date, Calendar는 자바의 정석을 통해 접한적이 있다.
time 패키지는 뭘까?

Step2. java.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현재 시간을 제공(시간대 별), 시간을 조작, 표시
Durationtime을 묵어서 표시 34.5초
Instant시간을 표현하기 위한 객체
LocalDate예) 2007-12-03
LocalDateTime예) 2007-12-03T10:15:30.
LocalTime예) 10:15:30
Month예) July
MonthDay예) 12-03
OffsetDateTimeDateTime에 UTC와의 차이를 표현, 예) 2007-12-03T10:15:30+3:00.
OffsetTimeTime표현에 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

Q. Zone은 어떻게 지정되나. 나는 이제것 java에서 시간을 설정해본 적이 없는걸?

내가 코딩한 프로그램을 실행하면 결국 시간을 확인할 수 있다.
결국 java에서 내가 한국에서 사용중인걸 알고 시간을 셋팅했다는 뜻이다.
기본값을 유동적으로 어떻게 바꿀수 있는가?

Zone의 내부를 조금 보자 public static ZoneId systemDefault()TimeZone.getDefault()를 쿼리한다.

엥? TimeZone?

  • TimeZone은 java.util에서 java8에 java.time의 Zone이 추가되기 전까지 사용된걸로 이해하면 편하다.
  • 즉, Zone은 TimeZone의 개선버전으로 이해하면 쉽다.
  • 결국 TimeZone의 id와 Zone의 id와 메서드는 거의 같다.

그래서 TimeZone.getDefault()의 역할은? 뭐냐

JVM이 구동되는 운영체제(시스템)에서 지정된 시간을 가져오는 메소드다.

java에서 시간기본값은 어떻게 지정되는가?

JVM에서 시스템 설정 된 시간을 가져와 사용한다.(지역정보 포함)

시간대 설정이 필요하다면? window 시간설정

java.time.chrono, format, temporal, zone?

java.time.<제목>의 몇가지 패키지가 더 있는데 이건 왜있지?

chrono : 캘린더 시스템을 위한 api
format : dates와 times를 parse해서 출력을 제공
temporal : 필드별 시간 조작
zone : 시간대 규칙과 관련된 조작

Setp3. 사용하기

결국 지금단계에서 내게 필요한 것은 년-월-일 단위로 기간을 지정하고,
새로운 날짜가 해당 기간안에 들어가는 지 확인하기 위해서다.

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);
        }
}

요론식으로 사용하면 될것 같다.

profile
N잡러 대충 이것저것 해보며 대충 사는 중

0개의 댓글