# Date/Time API

# 과거 API의 문제점

시간 API로는 Date와 GregorianCalendar가 있다.

  • 이름이 이상하다. 분명 Date인데, 시간을 가져올 수 있다.
  • Date의 시간을 출력해보면 long타입의 숫자가 나온다.(이는 자바의 epoch로1970년 1월 1일 00시 기준으로 현재까지의 초를 의미한다. -> 먼가 성능을 측정할 때 쓰일 것 같은 기계적인 시간이다.)
  • mutable하다. 시간에 값을 넣어 변경시킬 수 있다.(서비스에 장애를 일으키는 굉장히 큰 원인)

# 오늘날의 API

오늘날의 API는 값을 변경할 수 없으며 만약 변경을 하려고 하면 새로운 객체를 반환해주는 방법으로 변경이 이루어진다. 즉 Immutable하다.

# LocalDateTime

  • 사람들이 주로 사용하는 시간을 의미한다.
LocalDateTime now = LocalDateTime.now(); //현재 동작중인 서버의 시간
1
  • now()를 사용하면 현재의 시간을 반환해준다
LocalDateTime myBirthDay = LocalDateTime.of(1997, Month.MARCH, 24, 0, 0, 0, 0);
1
  • of()를 사용하여 특정 시간에 대한 정보를 표현해줄 수 있다.
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("MM/dd/yyyy");
String formatTime = time.format(format);
1
2
3
  • DateTimeFormatter를 활용해 format을 만들면 특정 format에 맞추어 String으로 반환해줄 수 있다.
  • 이때 DateTimeFormatter의 ofPattern을 사용하면 String으로 입력한 패턴을 얻을 수 있다.
  • format()에 매개변수로 위에서 만들어준 패턴을 넣어주면 LocalDateTime이 String으로 반환된다.
LocalDate parse = LocalDate.parse("06/30/2022", format);
1
  • 포맷으로 들어오는 정보를 파싱을 받을 수도 있다.
  • 위에서 만든 포맷이 MM/dd/yyyy이므로 year에 2022, MM에 06, dd에 30이 들어간 LocalDate가 반환된다.

# ZonedDateTime

  • 특정 지역의 시간을 표현하는데 사용
  • ZoneId를 활용해 특정 지역의 Id를 가져와서 적용할 수 있다.
ZonedDateTime nowInSeoul = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
1
  • 특정 지역의 id를 가져오는데 ZoneId의 of()를 사용하며 가져올 수 있다.
  • 그 값의 현재 시간값은 now()로 뽑을 수 있다.

# Period

  • DateTime의 두 시간의 차이를 계산해주는 것이다.
        LocalDate today = LocalDate.now();
        LocalDate anotherDay = LocalDate.of(2022, 02, 19);
        Period period = Period.between(today, thisYearBirthday);
        System.out.println(period.getDays()); // 두개의 시간의 차이(Day로 반환)
        
       Period until = today.until(thisYearBirthday);
       until.get(ChronoUnit.DAYS)
1
2
3
4
5
6
7
  • Period의 between()을 활용하여 두개의 시간의 차이를 반환해준다.
  • until()도 between()과 동일한 역할을 수행한다. (between을 쓸때와 동일한 역할을 수행한다.
  • get()으로 시간을 가져올 때 ChronoUnit을 활용하여 원하는 타입으로 가져올 수 있다.

# Instant

  • 성능 측정을 위한 시간을 가져온다.
Instant instant = Instant.now(); // 기준시 UTC, GMT
1
  • now()로 시간을 가져오면 UTC, GMT를 가져온다.
ZoneId zone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = instant.atZone(zone); 
1
2
  • atZone()을 활용하여 특정 지역의 시간대를 가져올 수 있다.

# Duration

 Instant start = instant.now();
 Instant plus = start.plus(10, ChronoUnit.SECONDS);
 Duration between = Duration.between(start, plus); // 10
1
2
3
  • Instant에 대한 시간의 비교의 차이를 구할 때 사용한다.

# 레거시 API와의 연동

Date date = new Date();
Instant dateToInstant = date.toInstant();
Date InstantToDate = Date.from(dateToInstant);
1
2
3
  • 이전 API인 Date를 Instant로 변경이 가능하다.
  • Instant도 Date로 변경이 가능하다.