본문 바로가기
Programming Language 이해하기/Java 이해하기

알아야만 하는 Java.time API 총 정리[기본편]

by simplify-len 2020. 9. 20.

들어가기

개발을 하다보면, 언젠간 마주치게 되는 날짜 관련 API. 자바의 경우 날짜 관련된 검색(ex, 7월의 한달은 몃일까?)을 하면 이전에 자바8 이전의 데이터가 비교적 많이 검색됩니다. 또한 Java 8에서 제공해주는 LocalDateTime 관련 API 를 사용하더라고, 그 라이브러리를 잘 모르니까 때문에 언젠간 한번 쯤 정리가 필요하다고 느꼈습니다.

 이 포스팅 시리즈는 LocalDate, LocalTime 다 쓸 수 있다고 자부하더라도, Temporal 이 무엇인지 몰라서 헤매는 저같은 사람에게 꼭 필요합니다.

다음 포스팅으로 

알아야만 하는 Java.time API 총 정리[실무&고급편]

추가했습니다.

0.LoadMap

기본편에서는 LocalDate, LocalTime, Instant, Duration, Period 의 기초를 간단히 이해하는 시간을 가져보겠습니다.

1. LocalDate, LocalTime

새로운 날짜와 시간 API를 사용할 때 가장 먼저 접하게 되는 API가 아닐까 싶습니다.

대부분의 정적 팩토리 메서드 of 로 LocalDate 인스턴스를 만들 수 있습니다.

LocalDate date = LocalDate.of(2014, 3, 18); 
int year = date.getYear(); // 2014 
Month month = date.getMonth(); // MARCH 
int day = date.getDayOfMonth(); // 18 
DayOfWeek dow = date.getDayOfWeek(); // TUESDAY 
int len = date.lengthOfMonth(); // 31 (days in March) 
boolean leap = date.isLeapYear(); // false (not a leap year)

 그 중 now() 메소드는 현재 날짜 정보를 반환합니다.

마찬가지로 LocalTime도 of 로서 데이터를 반환할 수 있습니다.

이 두개를 조합해서 우리는 이렇게 쓸 수 있습니다.

LocalDateTime dt1 = 
LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); // 2014-03-18T13:45 
LocalDateTime dt2 = LocalDateTime.of(date, time); 
LocalDateTime dt3 = date.atTime(13, 45, 20); 
LocalDateTime dt4 = date.atTime(time); // 새로운 LocalDateTime을 만든다. 
LocalDateTime dt5 = time.atDate(date); 
System.out.println(dt1);

LocalDateTime 은 LocalDate 와 LocalTime 을 합쳐 놓은 복합 클래스입니다.

반대의 경우도

LocalDate date = dt1.toLocalDate();
LocalTime time = dt1.toLocalTime();

이와 같이 합니다.

Return Method(매개변수) 설명
int getYear()
Month getMonth() Month 열거 값(JANUARY, FEBRUARY, MARCH ..)
int getMonthValue() 월(1, 2, 3 ..)
int getDayOfYear() 일년의 몇 번째 일
int getDayOfMonth() 월의 몇 번째 일
DayOfWeek getDayOfWeek() 요일(MONDAY, TUESDAY, WEDNESDAY..)
boolean isLeapYear() 윤년여부

 

Return Method(매개변수) 설명
int getHour() 시간
int getMinute()
int getSecond()
int getNano() 나노초

 

2. Instant: 기계의 날짜와 시간

 사람은 보통 주, 날짜, 시간, 분으로 날짜와 시간을 계산합니다. 하지만 기계에서는 이와같은 단위로 시간을 표현하기가 어려워 기계의 관점에서는 연속된 시간에서 특정 지점을 하나의 큰 수로 표현하는 것이 가장 자연스러운 시간 표현 방법입니다.

즉, Instant 클래스는 Unix Epoch time 을 기준으로 특정 지점까지의 시간을 초로 표현합니다.

사용은 아래와 같습니다.

Instant instant = Instant.ofEpochSecond(44 * 365 * 86400); 
Instant now = Instant.now(); 
Instant instant = Instant.ofEpochSecond(2, 1_000_000_000); // 2초 이후의 1억 나노초(1초)

Instant 는 기계를 위한 시간표현입니다.

그러므로

int day = Instant.now().get(ChronoField.DAY_OF_MONTH);

를 실행시, java.time.temporal.UnsupportedTemporalTypeException 예외가 발생합니다.

 

3. Duration과 Period

Duration 클래스의 정적 팩토리 메소드 between 으로 '두 시간 객체 사이' 의 지속시간을 만들 수 있습니다.

Period 클래스의 경우에는 getYears(), getMonths(), getDays() 메소드를 사용해서 년도 차이, 월의 차이, 일의 차이를 계산 할 수 있습니다.

Duration d1 = Duration.between(LocalTime.of(13, 45, 10), time); 
Duration d2 = Duration.between(instant, now); 
System.out.println(d1.getSeconds()); // 10 
System.out.println(d2.getSeconds()); // 179643836
Duration threeMinutes = Duration.ofMinutes(3); 
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES); 

Period tenDays = Period.ofDays(10); 
Period threeWeeks = Period.ofWeeks(3); 
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);

 

 

4. 날짜 포맷팅

LocalDate, LocalTime, LocaDateTime, ZonedDateTime 클래스의 format(DateTimeFormatter formatter) 메소드를 사용해서 원하는 문자열로 변환시킬 수 있습니다.

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 M월 d일 a h시 m분");
String nowString = now.format(dateTimeFormatter);   // 결과 : 2016년 4월 2일 오전 1시 4분

ofPattern() 메소드의 파라미터로 사용할 수 있는 패턴 기호에 대한 설명은 자바 API DateTimeFormatter 클래스의 Pattern for Formatting and Parsing을 참고하시면 좀 더 자세히 알 수 있습니다.

docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

댓글