본문 바로가기

BackEnd/java

[Java] 날짜, 시간표현 (LocalDateTime)

날짜표현(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

'BackEnd > java' 카테고리의 다른 글

[Java] class 파일 자바 버전 확인  (0) 2019.10.24