Programming/Java

[JAVA] 날짜와 시간 다루기(java.time)

cbw1030 2019. 11. 9. 23:36
반응형

기본적으로 자바에서는 날짜와 시간을 다루기 위해서 java.util.Datejava.util.Calendar 클래스를 사용했지만, 사용에 불편함이 많아 JDK8 이후부터는 java.time 패키지의 클래스로 많은 부분이 대체되었다.

 

[ 날짜 및 시간 구하기 ]

LocalDate, LocalTime, LocalDateTime

가장 기본이 되는 클래스들로 각각 날짜, 시간, 날짜와 시간을 다루는 클래스이다.

new 키워드를 통해 직접적인 인스턴스 생성이 불가능하고 static 메서드를 이용하는 방식을 사용한다.

  • now() : 현재 날짜, 시간에 기반하여 인스턴스 생성
  • of() : 인자로 전달되는 특정 날짜, 시간에 기반한 인스턴스 생성
  • atTime() : 특정 시간정보에 기반해 LocalDateTime 인스턴스 생성

예제를 한 번 만들어보도록 하자.

public class DateTimeTest1 {

    public static void main(String[] args) {
        LocalDate d1 = LocalDate.now();
        LocalDate d2 = LocalDate.of(2019, 10, 10);

        LocalTime t1 = LocalTime.now();
        LocalTime t2 = LocalTime.of(7, 20, 20);

        System.out.printf("LocalDate.now() : %s\n", d1);
        System.out.printf("LocalDate.of(2019,10,10) : %s\n", d2);
        System.out.printf("LocalTime.now() : %s\n", t1);
        System.out.printf("LocalTime.of(7,20,20) : %s\n", t2);

        LocalDateTime dt1 = LocalDate.now().atTime(LocalTime.MIDNIGHT);
        LocalDateTime dt2 = LocalDate.now().atTime(LocalTime.MAX);

        System.out.printf("LocalDate.now().atTime(LocalTime.MIDNIGHT) : %s\n", dt1);
        System.out.printf("LocalDate.now().atTime(LocalTime.MAX) : %s\n", dt2);
    }

}

예제 실행 결과

  • 별도의 형식을 지정하지 않았기 때문에 해당 객체에서 제공하는 기본 형식으로 출력 된다.
  • now()는 현재 날짜 및 시간, of()는 특정 날짜 및 시간 객체 생성
  • LocalDate에 Time을 추가하려면 atTime()를 사용하며 LocalDateTime이 리턴됨
  • LocalTime.MIDNIGHT, MAX, MIN, NOON 등 사용 가능.

 

[ 형식 지정하기 ]

java.time.format 패키지의 클래스들이 사용되며 대표적인 것은 DateTimeFormatter 클래스이다.

  • ofLocalizedDate() : 현재 지역(국가)에 따른 기본 표기 형식으로 출력
  • ofPattern() : 인자로 특정 포맷을 지정

[ 날짜와 시간차이 계산하기 ]

보통 날짜와 시간이 많이 사용되는 부분은 월별로 데이터를 관리하거나 특정 기간의 데이터를 조회하거나 하는 등의 작업이다.

  • Period : 날짜 사이의 간격을 년/월/일 단위로 나타낸다.
  • Duration : 시간 사이의 간격을 나노초 단위로 나타낸다.

예제를 한 번 만들어보도록 하자.

public class DateTimeTest2 {
    public static void main(String[] args) {
        LocalDateTime dt1 = LocalDateTime.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);

        System.out.println(dtf.format(dt1));
        System.out.println(dt1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

        System.out.println(dt1.plusDays(2));
        System.out.println(LocalTime.now().minusHours(3));
        System.out.println(Duration.ofMinutes(10).getSeconds());

        LocalTime start = LocalTime.of(11, 40, 50);
        LocalTime end = LocalTime.of(11, 42, 50);

        Duration duration = Duration.between(start, end);

        System.out.println("Seconds: " + duration.getSeconds());

        LocalDate startDate = LocalDate.of(1950, 9, 1);
        LocalDate endDate = LocalDate.of(2010, 9, 2);
        Period period = Period.between(startDate, endDate);

        System.out.println("Years: " + period.getYears());
        System.out.println("Months: " + period.getMonths());
        System.out.println("Days: " + period.getDays());
    }
}

실행 결과

  • Duration을 통해 시간 차이를 초단위로 계산
  • Period를 이용해 연/월/일 차이를 계산
반응형