Date와 Time API

이승민·2022년 10월 18일

JAVA8

목록 보기
14/18

Date와 Time API 소개

자바 8에 새로운 날짜와 시간 API가 생긴 이유

  • 그전까지 사용하던 java.util.Date 클래스는 mutable 하기 때문에 thread safe 하지 않다.
  • 클래스 이름이 명확하지 않다. Date인데 시간까지 다룬다.
  • 버그 발생할 여지가 많다. (타입 안정성이 없고, 월이 0부터 시작한다거나 ...)
  • 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤 했다.

자바 8에서 제공하는 Date-Time API

  • JSR-310 스펙의 구현체를 제공
  • 디자인 철학
    • Clear
    • Fluent
    • Immutable
    • Extensible

주요 API

  • 기계용 시간(machine time)과 인류용 시간(human time)으로 나눌 수 잇다.
  • 기계용 시간은 EPOCK (1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.
  • 인류용 시간은 우리가 흔히 사용하는 연, 월, 일, 시, 분, 초 등을 표현
  • 타임스탬프는 Instant를 사용한다.
  • 특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)를 사용할 수 있다.
  • 기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)를 사용할 수 있다.
  • DateTimeFormatter를 사용해서 일시를 특정한 문자열로 포매팅할 수 있다.

Date와 Tim API

지금 이 순간을 기계 시간으로 표현하는 방법

  • Instant.now(): 현재 UTC(GMT)를 리턴한다.
  • Universal Time Coordinated == Greenwich Mean Time
Instant instant = Instant.now();
        System.out.println(instant); //기준시 UTC, GMT
        System.out.println(instant.atZone(ZoneId.of("UTC")));

        ZoneId zone = ZoneId.systemDefault();
        System.out.println(zone);
        ZonedDateTime zonedDateTime = instant.atZone(zone);
        System.out.println(zonedDateTime);

인류용 일시를 표현하는 방법

  • LocalDateTime.now(): 현재 시스템 Zone에 해당하는(로컬) 일시를 리턴한다. -> 서버 배포시 서버가 있는 시간대가 적용
  • LocalDateTime.of(int, MOnth, int, int, int, int): 로컬의 특정 일시를 리턴한다.
  • ZoneDateTime.now(ZoneId.of(String)): 특정 zone의 현재 일시를 리턴한다.
  • ZonedDateTime.of(int, Mont, int, int, int, int, ZoneId): 특정 Zone의 특정 일시를 리턴한다.
LocalDateTime now = LocalDateTime.now();

        LocalDateTime birthDay =
                LocalDateTime.of(1982, Month.JUNE, 15, 0, 0, 0);

        ZonedDateTime nowInKorea = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));

기간을 표현하는 방법

  • Period.between() : Period는 human Time 비교
LocalDate today = LocalDate.now();
        LocalDate thisYearBirthDay = LocalDate.of(2022, Month.JUNE, 15);

        Period period = Period.between(today, thisYearBirthDay);
        System.out.println(period.getDays());

        Period until = today.until(thisYearBirthDay);
        System.out.println(until.get(ChronoUnit.DAYS));
  • Duration.between(): Duration은 machine Time 비교
Instant now = Instant.now();
        Instant plus = now.plus(10, ChronoUnit.SECONDS);
        Duration between = Duration.between(now, plus);
        System.out.println(between.getSeconds());

파싱 또는 포매팅

LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter MMddyy = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println(now.format(MMddyy));
  • LocalDateTime.parse(String, DateTimeFormatter);
LocalDate parse = LocalDate.parse("07/15/1982", MMddyy);
        System.out.println(parse);

레거시 API 지원

  • GregorianCalendar와 Date 타입의 인스턴스를 Instant나 ZonedDateTime으로 변환가능.
  • java.util.TimeZone에서 java.time.ZoneId로 상호 변환 가능
 Date date = new Date();
        Instant instant = date.toInstant();
        Date newDate = Date.from(instant);

        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        ZonedDateTime dateTime = gregorianCalendar.toInstant().atZone(ZoneId.systemDefault());
        GregorianCalendar from = GregorianCalendar.from(dateTime);

        ZoneId zoneId = TimeZone.getTimeZone("PST").toZoneId();
        TimeZone timeZone = TimeZone.getTimeZone(zoneId);

        LocalDateTime now = LocalDateTime.now();
        LocalDateTime plus = now.plus(10, ChronoUnit.DAYS);
```![](https://velog.velcdn.com/images/lee2963/post/0790e741-1b2e-4b6c-8db3-c21cdf9f2b7e/image.jpeg)
profile
💻 끊임없이 성장하는 백엔드 개발자 💻

0개의 댓글