반응형

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

  • Instant.now() : 현재 UTC (GMT)를 리턴한다.
  • Universal Time Coordinated == Greenwich Mean Time
Instant now = Instant.now();
System.out.println(now);
System.out.println(now.atZone(ZoneId.of("UTC")));

ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);

 

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

  • LocalDateTime.now() : 현재 시스템 Zone에 해당하는(로컬) 일시를 리턴한다.
  • LocalDateTime.of(int, Month, int, int, int, int) : 로컬의 특정 일시를 리턴한다.
  • ZonedDateTime.of(int, Month, int, int, int, int, ZoneId) : 특정 Zone의 특정 일시를 리턴한다.

 

기간을 표현하는 방법

  • Period / Duration.beteen()
Period between = Period.between(today, birthDay);
System.out.println(between.get(ChronoUnit.DAYS));

 

파싱 또는 포매팅

  • LocalDateTime.parse(String, DateTimeFormatter);
  • Datetime
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/d/yyyy");
LocalDate date = LocalDate.parse("07/15/1982", formatter);

System.out.println(date);
System.out.println(today.format(formatter));

 

레거시 API 지원

  • GregorianCalendar와 Date타입의 인스턴스를 InstantZonedDateTime으로 변환 가능.
  • java.util.TimeZone에서 java.time.ZoneId로 상호 변환 가능.
ZoneId newZoneAPI = TimeZone.getTimeZone("PST").toZoneId();

TimeZone legacyZoneAPI = TimeZone.getTimeZone(newZoneAPI);

Instant newInstant = new Date().toInstant();

Date legacyInstant = Date.from(newInstant);

 

Date-Time API 활용 예제

public class Main {
    public static void main(String[] args) {
        /*
            Date-Time는 서로 변환 가능하다.

            - Instant -> ZonedDateTime
                instant.atZone(ZoneId.of("Asia/Seoul"))

            - ZonedDateTime -> LocalDateTime
                zonedDateTime1.toLocalDateTime();

            - ZonedDateTime -> Instant
                zonedDateTime1.toInstant();
                        .
                        .
            파라미터에서 TemporalUnit 타입은 ChronoUnit으로 사용
        */

        /* 기계용 시간을 표현 */
        Instant instant = Instant.now(); //현재 UTC(GMT)를 리턴한다.
        System.out.println(instant); // 기준시 UTC, GMT
        System.out.println(instant.atZone(ZoneId.of("UTC")));
        System.out.println(instant.atZone(ZoneId.of("GMT")));
        System.out.println("#######################");

        //기계용 시간을 인류용 시간으로 변환 가능
        ZoneId zone = ZoneId.systemDefault(); //현재 지역을 리턴한다.
        System.out.println(zone);
        ZonedDateTime zonedDateTime = instant.atZone(zone); //기준시 UTC(GMT)를 현재 지역의 일시로 변환한다.
        System.out.println(zonedDateTime);
        System.out.println("#######################");

        /* 기계용 시간을 비교하는 방법 */
        Instant InstantNow = Instant.now();
        Instant plus = InstantNow.plus(10, ChronoUnit.SECONDS); //새로운 인스턴스 생성, 기존 인스턴스 변경하지 않음
        Duration between = Duration.between(InstantNow, plus);
        System.out.println(between.getSeconds()); //InstantNow와 plus의 기간
        System.out.println("#######################");

        /* 인류용 일시 표현 */
        LocalDateTime LocalDateTimeNow = LocalDateTime.now(); //현재 시스템 ZoneId를 참고해서 일시를 반환한다.
        DateTimeFormatter MMddyyyy = DateTimeFormatter.ofPattern("MM/dd/yyyy"); // 포맷 형태 직접 작성
        DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE; // 미리 정의해둔 포맷 사용

        System.out.println(LocalDateTimeNow);
        System.out.println(LocalDateTimeNow.format(MMddyyyy)); //LocalDateTimeNow 포매팅
        System.out.println(LocalDateTimeNow.format(isoLocalDate));//LocalDateTimeNow 포매팅
        System.out.println("#######################");
        LocalDate parse = LocalDate.parse("07/15/1982", MMddyyyy); //파싱
        System.out.println(parse);
        System.out.println("#######################");
        LocalDateTime birthDay2 = LocalDateTime.of(1993, Month.JUNE, 24, 0, 0, 0); //현재 시스템 일시 생성
        System.out.println(birthDay2);
        System.out.println("#######################");

        ZonedDateTime nowInKorea = ZonedDateTime.now(ZoneId.of("Asia/Seoul")); //특정 Zone의 일시를 반환한다.
        System.out.println(nowInKorea);
        System.out.println("#######################");

        ZonedDateTime zonedDateTime1 = instant.atZone(ZoneId.of("Asia/Seoul")); //기계 시간을 인류용 일시로 변환
        System.out.println(zonedDateTime1);
        System.out.println("#######################");

        /* 인류용 기간을 비교하는 방법 */
        LocalDate today = LocalDate.now();
        LocalDate thisYearBirthday = LocalDate.of(2021, Month.JUNE, 24);

        Period period = Period.between(today, thisYearBirthday); //today와 thisYearBirthday 기간
        System.out.println(period.getDays());

        Period until = today.until(thisYearBirthday); //today부터 thisYearBirthday 까지
        System.out.println(period.get(ChronoUnit.DAYS));

        /*
            레거시 API 지원
            서로 변환이 가능하다.
        */
        Date date2 = new Date();
        Instant instant2 = date2.toInstant();
        Date newDate = Date.from(instant2);

        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        //LocalDateTime localDateTime = gregorianCalendar.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        ZonedDateTime dateTime = gregorianCalendar.toInstant().atZone(ZoneId.systemDefault());
        GregorianCalendar from = GregorianCalendar.from(dateTime);

        ZoneId zoneId = TimeZone.getTimeZone("PST").toZoneId();
        TimeZone timeZone = TimeZone.getTimeZone(zoneId);
    }
}

[참고자료]

더 자바, Java 8, 백기선

반응형

+ Recent posts