[JAVA8] Date와 Time API

이재훈·2023년 5월 10일
0

JAVA8

목록 보기
9/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다. JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"


지금 이 순간을 기계 시간으로 표현하는 방법

  • Instant.now() : 현재 UTC (GMT)를 리턴한다.
  • Universal Time Coordinated == Greenwich Mean Time
public class App {
    public static void main(String[] args) {

        Instant instant = Instant.now();
        System.out.println("instant = " + instant); 
        // 기준시 UTC, GMT : instant = 2023-05-10T04:25:14.824841500Z

        ZoneId zone = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = instant.atZone(zone);
        System.out.println(zonedDateTime); 
        // 2023-05-10T13:27:55.748094500+09:00[Asia/Seoul]
    }
}

인류용 일시를 표현하는 방법

  • LocalDateTime.now() : 현재 시스템 Zone에 해당하는 (로컬) 일시를 리턴한다.
  • LocalDateTime.of(int, Month, int, int, int, int): 로컬의 특정 일시를 리턴한다.
  • ZonedDateTime.of(int, Month, int, int, int, int, ZoneId) : 특정 Zone의 특정 일시를 리턴한다.
public class App {
    public static void main(String[] args) {

        LocalDateTime now = LocalDateTime.now();

        System.out.println("now = " + now);
        // now = 2023-05-10T13:36:30.178957600
        // Local 시간이 나온다.
        // 미국 서버에 배포한다면 미국 서버 시간이 찍히게 된다.

        LocalDateTime anyDay = LocalDateTime.of(1955, Month.JULY, 15, 0, 0, 0);
        // 설정도 가능하다.
        
        ZonedDateTime nowInKorea = ZonedDateTime.now(ZoneId.of("Asia/Seoul")); 
        // 특정 지역의 시간도 가져올 수 있다.
        System.out.println(nowInKorea); 
        // 2023-05-10T13:41:22.696048200+09:00[Asia/Seoul]
    }
}

기간을 표현하는 방법

  • Period (휴먼용) .between()
public class App {
    public static void main(String[] args) {

        LocalDate today = LocalDate.now();
        LocalDate thisYearBirthDay = LocalDate.of(2023, Month.MAY, 20);

        Period period = Period.between(today, thisYearBirthDay);
        System.out.println(period.getDays());
        // 현재 5월 10일 print 10

        Period until = today.until(thisYearBirthDay);
        System.out.println(until.getDays());
        // 현재 5월 10일 print 10
    }
}
  • Duration (머신용) .between()
public class App {
    public static void main(String[] args) {

        Instant now = Instant.now();
        Instant plus = now.plus(10, ChronoUnit.SECONDS);

        Duration between = Duration.between(now, plus);
        System.out.println(between.getSeconds()); // 10
    }
}

파싱 또는 포매팅

  • LocalDateTime.parse(String, DateTimeFormatter);
  • Dateteme
public class App {
    public static void main(String[] args) {

        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println(now.format(format)); // 2023-05-10
        
        LocalDate parse = LocalDate.parse("1988-06-12", format); // 1988-06-12
        System.out.println(parse);
    }
}

아래 사이트에 미리 정의되어있는 format이 존재하니 확인해서 필요한 format이 있다면 새로 만들지 말고 사용하면 됩니다.
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

레거시 API 지원

  • GregorianCalendar와 Date 타입의 인스턴스를 Instant나 ZonedDateTime으로 변환 가능
  • java.util.TimeZone에서 java.time.ZoneId로 상호 변환 가능.

public class App {
    public static void main(String[] args) {

        Date date = new Date();
        Instant instant = date.toInstant();
        Date newDate = Date.from(instant);

        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        LocalDateTime localDateTime = gregorianCalendar.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        // localDateTime으로 변환이 가능하다.
    }
}

주의할 점

public class App {
    public static void main(String[] args) {
        
        LocalDate now = LocalDate.now();
        LocalDate localDate = now.plusDays(10);
        // 새로운 인스턴스가 생기는 것이기 때문에 담은 값을 사용해야 한다.
        Period until = now.until(localDate);
        System.out.println(until.getDays()); // 10
    }
}
profile
부족함을 인정하고 노력하자

0개의 댓글