Java8 의 날짜 API 사용하기.
13 Dec 2018 | Java Java8 DateTimeJava 1.8 이전 버전의 SDK에서 날짜와 시간을 다루는 java.util.Date 클래스와 java.util.Calendar 클래스는 사용하기가 불편하고 직관적이지 않으며 또한 java.util.Date와 SimpleDateFormatter는 Thread-Safe 하지 않아서 잠재적인 동시성 문제를 가지고 있다. 많이 늦었지만 JDK 8에서는 개선된 날짜와 시간 API가 제공된다.
기존 API
- java.util.Date - 날짜와 시간, 기본 시간대를 사용하여 출력.
- java.util.Calendar - 날짜와 시간, 날짜를 조작하는데 더 많은 메소드 제공.
- java.text.SimpleDateFormat - 날짜와 달력을위한 형식 (날짜 -> 텍스트), 변환 (텍스트 -> 날짜).
JAVA8 에서 추가된 API
- java.time.LocalDate - 날짜(시간 포함하지 않음), 타임존 사용하지 않음.
- java.time.LocalTime - 시간(날짜 포함하지 않음), 타임존 사용하지 않음.
- java.time.LocalDateTime - 날짜 및 시간, 타임존 사용하지 않음.
- java.time.ZonedDateTime - 날짜 및 시간, 타임존 사용.
- java.time.DateTimeFormatter - java.time에 대한 형식 (날짜 -> 텍스트), 변환 (텍스트 -> 날짜)
- java.time.Duration - 시간을 초 단위 및 나노초 단위로 측정한다.
- java.time.Period - 시간을 년, 월, 일로 측정한다.
- java.time.TemporalAdjuster - 날짜를 조정한다.
사용해보기
예제코드 1)
- 컴퓨터의 현재 날짜 출력.
import java.time.*;
public class WorkingWithLocalDate {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
}
}
예제코드 2)
- 특정 일, 월 및 연도 지정하여 반환하고 싶을 때 LocalDate.of 메서드를 사용하거나 LocalDate.parse 메서드를 사용.
import java.time.*;
import java.time.format.DateTimeFormatter;
public class WorkingWithLocalDate {
public static void main(String[] args) {
//다음날짜로 지정 (2017-12-12)
LocalDate localDate = LocalDate.of(2017, 12, 12);
System.out.println(localDate);
//다음날짜로 지정 (2017-12-05)
localDate = LocalDate.parse("2018-12-05");
System.out.println(localDate);
}
}
출력 :
2017-12-12
2018-12-05
예제코드 3)
- LocalDate parse 사용시에 포멧 형식 변경하여 사용할 경우.
import java.time.*;
import java.time.format.DateTimeFormatter;
public class WorkingWithLocalDate {
public static void main(String[] args) {
// LocalDate parse 사용 시 포멧 형식 변경해서 사용 시
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
String date = "18/09/2018";
//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println(localDate);
// LocalDateTime 사용 시 pattern 지정하여 출력하기.
LocalDateTime now = LocalDateTime.now();
System.out.println("Before : " + now);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatDateTime = now.format(formatter2);
System.out.println("After : " + formatDateTime);
}
}
출력 :
2018-09-18
Before : 2018-12-13T09:49:53.383
After : 2018-12-13 09:49:53
예제코드 4)
- 날짜 시간 증감시키기 예제
import java.time.*;
import java.time.format.DateTimeFormatter;
public class WorkingWithLocalDate2 {
public static void main(String[] args) {
//날짜 시간 증감.
LocalDateTime localDateTime = LocalDateTime.of(2018, 12, 12, 0, 0, 0);
LocalDateTime changedLocalDateTime = localDateTime.plusDays(1); // 일
System.out.println(changedLocalDateTime); // 출력 : 2018-12-13T00:00
changedLocalDateTime = localDateTime.plusMonths(1); // 월
System.out.println(changedLocalDateTime); //출력 : 2019-01-12T00:00
changedLocalDateTime = localDateTime.plusHours(1); // 시간
System.out.println(changedLocalDateTime); //출력 : 2018-12-12T01:00
changedLocalDateTime = localDateTime.plusWeeks(1); // 주
System.out.println(changedLocalDateTime); //출력 : 2018-12-19T00:00
changedLocalDateTime = localDateTime.minusYears(1); // 년
System.out.println(changedLocalDateTime); //출력 : 2017-12-12T00:00
changedLocalDateTime = localDateTime.minusMinutes(1); // 분
System.out.println(changedLocalDateTime); //출력 : 2018-12-11T23:59
}
}
출력 :
2018-12-13T00:00
2019-01-12T00:00
2018-12-12T01:00
2018-12-19T00:00
2017-12-12T00:00
2018-12-11T23:59
예제코드 5)
- 특정 지역의 시간에 의존하지 않고 날짜와 시간을 표현하고 싶다면 ZonedDateTime 클래스를 사용하면 된다.
import java.time.*;
import java.time.format.DateTimeFormatter;
public class WorkingWithLocalDate {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.of(2018, Month.DECEMBER, 12, 9, 00, 00);
// UTC+9는 서울시간
ZonedDateTime seoulTime = dateTime.atZone(ZoneId.of("Asia/Seoul"));
System.out.println("ZonedDateTime : " + seoulTime);
//세계표준시.
Instant instant = seoulTime.toInstant();
System.out.println("Instant : " + instant);
}
}
서울시간이 UTC (세계 표준시) 보다 9시간이 빠르다.
만약 서울시간이 2018-12-12 09:00:00 일경우 표준시는 2018-12-12 00:00:00 가 된다.
출력 :
ZonedDateTime : 2018-12-12T09:00+09:00[Asia/Seoul]
Instant : 2018-12-12T00:00:00Z
예제코드 6)
- Period를 통해 두 “날짜” 사이의 간격을 알 수 있다.
import java.time.*;
import java.time.format.DateTimeFormatter;
public class WorkingWithLocalDate {
public static void main(String[] args) {
LocalDate startDate = LocalDate.of(2010, 10, 18);
LocalDate endDate = LocalDate.of(2018, 12, 12);
Period period = Period.between(startDate, endDate);
System.out.println(period.getYears() + " 년" + period.getMonths() + " 월" + period.getDays() + " 일");
}
}
출력:
8 년1 월24 일
참고:
- http://starplatina.tistory.com/entry/Java-8-%EC%83%88%EB%A1%9C%EC%9A%B4-Date-Time-API
- http://www.mkyong.com/tutorials/java-date-time-tutorials/