BackEnd/java
[Java] 날짜, 시간표현 (LocalDateTime)
mooogi
2021. 5. 3. 15:52
날짜표현(JSR-310, java.time) - LocalDate, LocalTime, LocalDateTime
-
Date, Calrendar클래스 사용시의 문제점
- 월값이 0부터 시작한다 ( 1월 → 0 )
- 다른 언어와 달리 기본 날짜, 시간 클래스가 불변객체가 아니다
- private final 로 지정해둔 Date를 사용하는 등 방어복사기법이 필요하다
- Calendar에서 반환된 요일은 int값 일요일이 1부터 시작한다 Date.getDay()에서는 일요일이 0부터시작한다 (현재 deprecated되어 사용되진 않음)
- 특정 시간대의 날짜를 생성하거나, 년/월/일을 통한 날짜연산을 위해서는 Date클래스와 Calendar 클래스를 함께 사용해야한다
- 중간객체를 사용하는것 자체도 불편하며 Calendar객체의 생성 비용이 비싼편이다
- 이외에도 여러 상수 필드를 사용하여 잘못된 입력에도 오류가 발생하지 않는 등의 불편함이 있다
-
JSR-310(java.time)
- 새로운 Java의 날짜 API(2014, JDK8부터 사용가능 JDK7 백포트 모듈 있음)
- Joda-Time에 가장 많은 영향을 받았으며 이외에도 여러 오픈소스 라이브러리를 참고했다고한다
- LocalDate: 날짜 정보, LocalTime: 시간 정보, LocalDateTime :날짜 + 시간정보
-
사용예시
-
LocalDate
LocalDate locDate = LocalDate.now(); //2021-05-01 LocalDate myDate = LocalDate.of(2001,01,02); //2001-01-02
-
LocalTime
LocalTime locTime = LocalTime.now(); //18:21:52.659944 LocalTime myTime = LocalTime.of(12,01,02,03); //12:01:02.000000003
- LocalTime.of 사용시 세번째 인자는 second, 네번째 인자는 nanoSecond값으로 생략가능
-
LocalDateTime
- LocalDateTime 인스턴스를 출력해보면 T가 포함되어있는데, 이는 ISO형식 시간표기법이라는 의미이다
- Format없이 String에서 LocalDateTime으로 파싱시 T부분이 빠지면 Exception이 발생한다
LocalDateTime locDateTime = LocalDateTime.now(); //2021-05-01T 18:30:19.653060
-
날짜, 시간 더하고 빼기
- plusYear(long), plusMonth(long), minusYear(long), minusMonth(long)...
- 기존 LocalDateTime의 값을 변경하지 않으며,
해당 함수의 실행결과가 담긴 새로운 LocalDateTime객체를 리턴받는다
LocalDateTime plusDateTime = locDateTime.plusYears(1); //2022-05-01T18:34:33.323258
-
날짜, 시간 비교
- isBefore(LocalDateTime), isAfter(LocalDateTime), isEqual(LocalDateTime)...
LocalDate firstDate = LocalDate.of(2021, 01, 01); LocalDate secondDate = LocalDate.of(2021, 02, 01); firstDate.isBefore(secondDate); //true firstDate.isAfter(secondDate); //false firstDate.isEqual(secondDate); //false firstDate.plusMonths(1).isEqual(secondDate)); //true
- LocalDateTime 또는 LocalTime 비교시 nanoSecond까지 비교가되므로 주의한다
-
날짜 차이 계산
- Period : 두 날짜의 차이를 년, 월 ,일의 값으로 구분하여 결과를 얻을 수 있다
- ChronoUnit : 두 날짜의 차이를 년, 월, 일 등의 특정 기준으로 계산된 결과를 얻을 수 있다
LocalDate ldt1 = LocalDate.of(2019, 1, 1); LocalDate ldt2 = LocalDate.of(2021, 4, 5); Period prd = Period.between(ldt1,ldt2); prd.getYears(); //2 prd.getMonths(); //3 prd.getDays(); //4 ChronoUnit.YEARS.between(ldt1, ldt2); //2 ChronoUnit.MONTHS.between(ldt1, ldt2); //27 ChronoUnit.DAYS.between(ldt1, ldt2); //825
- ChronoUnit에서 년 기준 2년 6개월 이상 차이가나는 경우를 테스트해보았는데버림방식으로 보임
-
LocalDateTime to String, String to LocalDateTime
//LocalDateTime을 특정 format의 String으로 LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dtFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); String ldtStr = now.format(dtFmt); //2021-05-03 02:42:09 //특정 format의 날짜를 LocalDateTime으로 LocalDateTime ldtParse1 = LocalDateTime.parse("2021-01-01T15:39:30"); //ldtParse1 : 2021-01-01T15:39:30 LocalDateTime ldtParse2 = LocalDateTime.parse("2021/02/02 15:39:30" , DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); //ldtParse2 : 2021-02-02T10:13:30
-