ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java8. Date-Time API
    BackEnd/Java 2022. 1. 22. 15:19
    반응형

      기존 java.util.Date 클래스의 경우 mutable(값을 변경할 수 있다.)하기 때문에 thread safe하지 않았습니다. 또한, 클래스 이름이 명확하지 않고(Date인데 Time까지 다룬다.), 버그가 발생할 여지가 많았습니다(타입 안정성이 없고, 월이 0부터 시작한다.). 이로 인해 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 사용했습니다.

     

      Java8에서 제공하는 Date-Time API는 JSR-310 Spec.의 구현체를 제공합니다.

     

    Date-Time Design Principles

    • Clear: API가 명확해야 합니다.
    • Fluent: 코드가 읽기 쉽고, 메서드 호출을 연결할 수 있습니다.
    • Immutable: 기존의 인스턴스는 변경할 수 없고, 새로운 인스턴스를 생성합니다.
    • Extensible: 확장이 가능합니다.

     

    주요 API

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

     

    Instant (Machine Time)

    import java.time.Instant;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    
    public class DateTime {
    
      public static void main(String[] args) {
        // Machine time
        Instant instant = Instant.now();
        // 기준시는 UTC(Universal Time Coordinated), GMT(Greenwich Mean Time) 기준입니다.
        System.out.println(instant); // [결과]: 2022-01-22T05:52:50.119166Z
        // Asia/Seoul 기준으로 설정합니다.
        System.out.println(instant.atZone(ZoneId.of("Asia/Seoul"))); // [결과]: 2022-01-22T14:52:50.119166+09:00[Asia/Seoul]
        // 시스템 기본으로 설정합니다.
        ZoneId zone = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = instant.atZone(zone);
        System.out.println(zonedDateTime); // [결과]: 2022-01-22T14:52:50.119166+09:00[Asia/Seoul]
      }
    
    }

    LocalDateTime (Human Time)

    import java.time.LocalDateTime;
    import java.time.Month;
    
    public class DateTime {
    
      public static void main(String[] args) {
        // Human time
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now); // [결과]: 2022-01-22T14:56:17.325537
    
        LocalDateTime today = LocalDateTime.of(2022, Month.JANUARY, 22, 14, 55, 59);
        System.out.println(today); // [결과]: 2022-01-22T14:55:59
      }
    
    }

    Duration (Machine) / Period (Human)

    import java.time.Duration;
    import java.time.Instant;
    import java.time.LocalDate;
    import java.time.Month;
    import java.time.Period;
    import java.time.temporal.ChronoUnit;
    
    public class DateTime {
    
      public static void main(String[] args) {
        // 현재부터 현재에서 10초를 더한 기간을 구합니다. (Machine: Duration)
        Instant instant = Instant.now();
        Instant plus = instant.plus(10, ChronoUnit.SECONDS);
        Duration between = Duration.between(instant, plus);
        System.out.println(between.getSeconds()); // [결과]: 10
    
        // 현재부터 설날까지의 기간을 계산합니다. (Human: Period)
        LocalDate now = LocalDate.now();
        LocalDate newYearsDay = LocalDate.of(2022, Month.FEBRUARY, 1);
        Period period = Period.between(now, newYearsDay);
        System.out.println(period.getDays()); // [결과]: 10
    
        Period until = now.until(newYearsDay);
        System.out.println(until.get(ChronoUnit.DAYS)); // [결과]: 10
      }
    
    }

    Parse / Formatter

    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class DateTime {
    
      public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter MMddyyyy = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println(now.format(MMddyyyy)); // [결과]: 01/22/2022
    
        LocalDate parse = LocalDate.parse("01/22/2022", MMddyyyy);
        System.out.println(parse); // [결과]: 2022-01-22
      }
    
    }

    Legacy API Support

    • GregorianCalendar와 Date 타입의 인스턴스를 Instant나 ZonedDateTime으로 변환 가능합니다.
    • java.util.TimeZone에서 java.time.ZoneId로 상호 변환이 가능합니다.
    import java.time.Instant;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.TimeZone;
    
    public class DateTime {
    
      public static void main(String[] args) {
        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);
      }
    
    }

     

    반응형

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

    Callable과 Future  (0) 2022.01.23
    Multi-Thread Programming  (0) 2022.01.23
    Java8. Optional  (0) 2022.01.22
    Java8. 스트림 (Stream)  (0) 2022.01.22
    Java8. 기본 메소드 (Default Method)와 스태틱 메소드 (Static Method)  (0) 2022.01.22

    댓글

Designed by Tistory.