728x90
728x90
Date/Time API
과거 API의 문제점
시간 API로는 Date와 GregorianCalendar가 있다.
- 이름이 이상하다. 분명 Date인데, 시간을 가져올 수 있다.
- Date의 시간을 출력해보면 long타입의 숫자가 나온다.(이는 자바의 epoch로1970년 1월 1일 00시 기준으로 현재까지의 초를 의미한다. -> 먼가 성능을 측정할 때 쓰일 것 같은 기계적인 시간이다.)
- mutable하다. 시간에 값을 넣어 변경시킬 수 있다.(서비스에 장애를 일으키는 굉장히 큰 원인)
오늘날의 API
오늘날의 API는 값을 변경할 수 없으며 만약 변경을 하려고 하면 새로운 객체를 반환해주는 방법으로 변경이 이루어진다. 즉 Immutable하다.
LocalDateTime
- 사람들이 주로 사용하는 시간을 의미한다.
LocalDateTime now = LocalDateTime.now(); //현재 동작중인 서버의 시간
- now()를 사용하면 현재의 시간을 반환해준다
LocalDateTime myBirthDay = LocalDateTime.of(1997, Month.MARCH, 24, 0, 0, 0, 0);
- of()를 사용하여 특정 시간에 대한 정보를 표현해줄 수 있다.
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("MM/dd/yyyy");
String formatTime = time.format(format);
- DateTimeFormatter를 활용해 format을 만들면 특정 format에 맞추어 String으로 반환해줄 수 있다.
- 이때 DateTimeFormatter의 ofPattern을 사용하면 String으로 입력한 패턴을 얻을 수 있다.
- format()에 매개변수로 위에서 만들어준 패턴을 넣어주면 LocalDateTime이 String으로 반환된다.
LocalDate parse = LocalDate.parse("06/30/2022", format);
- 포맷으로 들어오는 정보를 파싱을 받을 수도 있다.
- 위에서 만든 포맷이 MM/dd/yyyy이므로 year에 2022, MM에 06, dd에 30이 들어간 LocalDate가 반환된다.
ZonedDateTime
- 특정 지역의 시간을 표현하는데 사용
- ZoneId를 활용해 특정 지역의 Id를 가져와서 적용할 수 있다.
ZonedDateTime nowInSeoul = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
- 특정 지역의 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)
Period의 between()을 활용하여 두개의 시간의 차이를 반환해준다.
until()도 between()과 동일한 역할을 수행한다. (between을 쓸때와 동일한 역할을 수행한다.
get()으로 시간을 가져올 때 ChronoUnit을 활용하여 원하는 타입으로 가져올 수 있다.
Instant
- 성능 측정을 위한 시간을 가져온다.
Instant instant = Instant.now(); // 기준시 UTC, GMT
- now()로 시간을 가져오면 UTC, GMT를 가져온다.
ZoneId zone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = instant.atZone(zone);
- atZone()을 활용하여 특정 지역의 시간대를 가져올 수 있다.
Duration
Instant start = instant.now();
Instant plus = start.plus(10, ChronoUnit.SECONDS);
Duration between = Duration.between(start, plus); // 10
- Instant에 대한 시간의 비교의 차이를 구할 때 사용한다.
레거시 API와의 연동
Date date = new Date();
Instant dateToInstant = date.toInstant();
Date InstantToDate = Date.from(dateToInstant);
- 이전 API인 Date를 Instant로 변경이 가능하다.
- Instant도 Date로 변경이 가능하다.
728x90
728x90
'Language > Java' 카테고리의 다른 글
자바 Excuter로 쓰레드 처리하기 (0) | 2022.03.03 |
---|---|
자바 쓰레드의 기초 (0) | 2022.03.03 |
Optional을 알아보자! (0) | 2022.02.27 |
Java8의 Stream을 알아보자! (0) | 2022.02.22 |
인터페이스의 default와 static 메소드 java8 (0) | 2022.02.20 |