-
챕터[12] 새로운 날짜와 시간 API모던자바인액션 2020. 10. 21. 16:03
서론
사람 및 기계가 이해할 수 있는 날짜와 시간 표기 방법
-
시간
-
PST : 태평양 표준시(워싱턴, 켈리포니아)
-
CST : 중부 표준시(미국 중부, 멕시코, 중앙아메리카)
-
EST : 동부 표준시(미국 동부, 캐나다)
-
GMT : 그리니치 표준시(런던, 협정 세계시와 동일한 시간)
-
UTC : 협정세계시(세계 공통 표준시)
-
CET : 중부 유럽 표준시(유럽, 북아프리카)
-
EET : 동유럽 표준시(동유럽 일부, 북아프리카, 중동 일부 지역)
-
개요
이번 챕터에서는 이러한 날짜 API 제공을 해주구나 정도?
(개인적으로 입력한 날짜를 받고 저장하거나, 해당 년도가 윤년인지 판단... 정도만 다뤄봐서 이번 챕터는 아하 정도로 넘어가면 좋을꺼 같다고 생각이든다. 물론 내 머리가 이정도밖에 생각을 못하니 그러겠지만)쟈바 8 ~ 생긴 java.time 을 알아보자...
LocalDateTime
LocalDate(년, 월, 일) + LocalTime(시, 분, 초) 두개를 동시에 표시할 수 있다.ex:) 월은 int, Month 2개의 입력을 받을 수 있다.
LocalDateTime 예제// LocalDate, LocalTime // yyyy-mm-dd LocalDate date = LocalDate.now(); // hh:mm:ss.ms LocalTime time = LocalTime.now(); // 직접 때려박기 LocalDateTime d1 = LocalDateTime.of(2011, 10, 22, 14, 26, 1); // LocalDate + LocalTime (더하기) LocalDateTime d2 = LocalDateTime.of(date, time); // LocalDate + 시간 때려박기 (LocalDate 객체와 사용자 지정 시간) LocalDateTime d3 = date.atTime(12, 10, 20); // d3 방식처럼 날짜를 조합 시 인자값으로 int를 지원하는게 아닌 LocalDate 만 지원하기에 사용자 지정으로 생성할 수 없다. LocalDateTime d4 = time.atDate(date);
Instant
기계적 관점에서 UTC 기준으로 특정 지점까지의 시간을 초로 표현한다.
Instant 는 나노초(10억분의 1초)까지의 정밀도를 제공
UTC(1970 01 01) 기준으로 얼마나 흐른지라...(기계관점)
내가 기계관점인지 사람관점인지 판단할 수 있네 ㅋ// 1970-01-01T00:00:00.003Z Instant instant1 = Instant.ofEpochMilli(3); // 1970-01-01T00:00:03Z Instant instant2 = Instant.ofEpochSecond(3); // 1970-01-01T00:00:04Z Instant instant3 = Instant.ofEpochSecond(3, 1_000_000_000);
Duration과 Period
Duration : 두 시간 사이의 간격
Period : 두 날짜 사이의 간격
Duration 은 시간비교이기에 LocalDate는 전달하지 못한다( LocalDateTime은 가능함 )
날짜조정, 파싱, 포매팅
절대적으로 숫자 입력해서 변경도 가능하며 그밖에 현재 기준 년 월 일 에서 마이너스 플러스로 값을 변경할 수 있다.
그 밖 조금더 정확한 시간을 설정하기 위하여 TemporalAdjusters기능도 제공한다.
해당월의 첫번째일
해당월의 마지막일... 등등 월, 화, 수요일은 몇일인지 조금더 세밀하게 표현이 가능함.
// 2017-05-22 LocalDate date1 = LocalDate.of(2017, 05, 22); // 2019-05-22 LocalDate date2 = date1.withYear(2019); // 2019-02-22 LocalDate date3 = date2.withMonth(2); // 2019-02-11 LocalDate date4 = date3.withDayOfMonth(11); // 2019-02-10 LocalDate date5 = date4.minusDays(1); // 2019-02-11 LocalDate date6 = date5.plusDays(1); // TemporalAdjusters 사용 // 이번주 아니면 돌아오는 월요일 // 2017-05-22 그대로 뜬다. LocalDate dd1 = date1.with(nextOrSame(DayOfWeek.MONDAY)); // 해당 월에 첫일???????????? 2017-05-01 LocalDate dd2 = date1.with(firstDayOfMonth());
시간대사용
지역 Id를 이용하여 해당 시간대로 포맷팅을 할 수 있다 단 (지역Id를 알아야함)
// ZoneId를 알아야 사용이 가능하다... ZoneId romeZone = ZoneId.of("Europe/Rome"); LocalDate date = LocalDate.of(2017, 5, 22); // 2017-05-22T00:00+02:00[Europe/Rome] ZonedDateTime zdt1 = date.atStartOfDay(romeZone); LocalDateTime localDateTime = LocalDateTime.of(2019, 2, 11, 06, 00, 10); // 2019-02-11T06:00:10+01:00[Europe/Rome] ZonedDateTime zdt2 = localDateTime.atZone(romeZone); Instant instant = Instant.now(); // 2020-08-06T09:36:46.365+02:00[Europe/Rome] ZonedDateTime zdt3 = instant.atZone(romeZone);
'모던자바인액션' 카테고리의 다른 글
챕터[14] 자바 모듈 시스템 (0) 2020.10.21 챕터[13] 디폴트 메서드 (0) 2020.10.21 챕터[11] null 대신 Optional 클래스 (0) 2020.10.21 챕터[10] 도메인 전용 언어 DSL (0) 2020.10.21 챕터[9] 리팩터링, 테스팅, 디버깅 (0) 2020.10.21 -