ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 챕터[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);

     

    댓글

Designed by Tistory.