☕️Java/Date API
[Java 날짜 API] Date to LocalDate, LocalDateTime, DateTime.
PCOSPD 100LRE SCRIE4A2
2023. 1. 25. 00:34
Java 날짜 API. Date. LocalDate. LocalDateTime. DateTime.
Java의 날짜 API는 우여곡절이 많았다.
Java 1.0에서 처음 등장한 Date객체는 사용성과 안정성이 매우 떨어지는 API 였다.
때문에 JodaTime과 같은 Open Source 날짜 API가 한동안 사용되 왔다.
그러다 JDK 1.8 버전이 등장하면서 비로소 java.time 패키지가 제공되며 공식적으로 개선된 날짜 API가 릴리즈 되었다.
위와 같은 이유로 기존 레거시 코드에서는 Date를 사용하고 있는 상태가 많다.
Date 객체를 LocalDateTime 객체로 서서히 migration 해가야 하는 상황에 있다면,
이들 날짜 API 간에 형변환 해야 하는 상황이 많을 것이다.
그래서 아래에 날짜 API 간의 형변환 방법을 정리하고자 한다.
1. Date to LocalDateTime.
방법1. Instant 객체 이용.
Date -> Instant -> LocalDateTime 으로 중간에 Instant 객체를 거치는 과정이 있다.
Date date = new Date();
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
log.info(localDateTime); // 2023-01-24T22:45:49.533
Date -> LocalDate 는 LocalDateTime으로 변환하는 과정과 같다.
Date date = new Date();
LocalDateTime localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
log.info(localDate); // 2023-01-24.
방법2. java.sql 패키지 이용.
Date -> Timestamp -> LocalDateTime.
Date date = new Date();
LocalDateTime localDateTime = new java.sql.Timestamp(date.getTime()).toLocalDateTime();
log.info(localDateTime); // 2023-01-25T00:07:28.316
Date -> java.sql.Date -> LocalDate.
Date date = new Date();
LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate();
log.info(localDate); // 2023-01-25
2. LocalDateTime || LocalDate to Date.
방법1. LocalDateTime -> java.sql.Timestamp.valueOf -> Date.
LocalDateTime localDateTime = LocalDateTime.now();
Date date = java.sql.Timestamp.valueOf(localDateTime); // java.sql 패키지 이지만 java.util.Date로 변환한다.
log.info(date); //2023-01-25 00:07:28.317
방법2. Instant -> Date.from(instant) 이용.
LocalDateTime localDateTime = LocalDateTime.now();
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date date = Date.from(instant);
log.info(date); // Wed Jan 25 00:07:28 KST 2023
3. org.joda.time.DateTime <-> java.util.Date
Date date = new Date();
DateTime dateTime = new DateTime(date); // 생성자의 인자로 전달.
log.info(dateTime); // 2023-01-25T00:07:28.322+09:00
Date date2 = dateTime.toDate(); // toDate 메서드로 간편하게.
log.info(date2); // Wed Jan 25 00:07:28 KST 2023
4. org.joda.time.DateTime <-> java.time.LocalDateTime.
Instant 객체로 중간 변환후 time 객체로 변환.
LocalDateTime localDateTime = LocalDateTime.now();
Instant insntant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
DateTime dateTime = new DateTime(instant.toEpochMilli());
log.info(dateTime);
instant를 epoch milliseconds로 변환해서 DateTime 생성자의 인자로 전달한다.
여기서 epoch(에포크) 란. 특정 시간대의 기준. 1970-01-01 00:00:00Z를 말한다.
기준이 되는 1970-01-01 로 부터 millisecond로 얼마나의 시간이 지났나를 측정한 값이 instant.toEpochMilli() 이다.