1. ZonedDateTime클래스

Date Time API에는 매우 흥미로운 또 다른 클래스가 있습니다. 바로 ZonedDateTime클래스입니다. 주요 목적은 다른 시간대의 날짜로 작업하는 것을 편리하게 만드는 것입니다.

LocalDate날짜를 나타내는 데 좋습니다. 예를 들어, 생일. 내 생일은 내가 어디에 있든 상관없이 3월 15일입니다. 이것은 날짜의 예입니다.

LocalTime알람 시계에 설정된 시간처럼 시간을 설명하는 데 유용합니다. 저는 오전 5시에 알람을 설정했고 제가 어디에 있는지는 중요하지 않습니다. 오전 5시는 오전 5시입니다. 이것은 시간 작업의 예입니다.

이제 항공편을 예약하는 애플리케이션을 작성한다고 가정해 보겠습니다. 비행기는 현지 시간에 따라 이착륙합니다. 비행기는 고정된 시간 동안 공중에 있지만 시간대는 변경될 수 있습니다.

시간대

그건 그렇고, 시간대는 정말 엉망입니다. 그리고 24개의 시간대가 있다고 생각하면 큰 착각이다.

예를 들어 인도의 시간은 그리니치 표준시와 5시간 30분 차이가 납니다 GMT+5:30. 일부 국가는 일광 절약 시간제로 전환하고 다른 국가는 그렇지 않습니다. 또한 국가마다 연중 다른 시기에 서머타임으로 전환합니다.

그리고 일부 국가에서는 일광 절약 시간제를 취소하거나 다시 도입하거나 다시 취소하는 법을 통과시킵니다.

어쨌든 세계에는 시간대가 있고 각 시간대에는 하나의 시간이 있습니다. 서로 다른 영역의 시간은 연중 특정 기간 동안 일치할 수 있으며 다른 기간에는 다를 수 있습니다. 표준 시간대는 일반적으로 해당 지역에 위치한 주요 도시의 이름을 따서 명명됩니다: Europe/Monaco, Asia/Singapore하지만 예외도 있습니다 — US/Pacific.

공식적으로 현재 599개의 시간대가 있습니다. 생각해 보세요. 599개입니다. 24개와는 거리가 멉니다. 글로벌 세계에 오신 것을 환영합니다.

ZoneId패키지 의 클래스는 Java java.time에서 시간대를 저장하는 데 사용됩니다.

그건 그렇고, getAvailableZoneIds()현재 알려진 모든 표준 시간대 집합을 반환하는 정적 메서드가 있습니다. 모든 영역 목록을 가져오려면 다음 코드를 작성해야 합니다.

암호 콘솔 출력(일부)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

이름으로 개체를 가져오려면 ZoneId정적 메서드를 사용해야 합니다 of().

암호 메모
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. ZonedDateTime객체 생성

개체를 만들 때 ZonedDateTime클래스의 정적 now()메서드를 호출하고 ZoneId개체를 전달해야 합니다.

암호 콘솔 출력
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

ZoneId메서드에 개체를 전달하지 않는 경우 now()(허용되는 경우) 시간대는 프로그램을 실행하는 컴퓨터의 설정에 따라 자동으로 결정됩니다.

예:

암호 콘솔 출력
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

글로벌 날짜를 로컬 날짜로 변환

의 흥미로운 기능 중 하나는 ZonedDateTime현지 날짜 및 시간으로 변환하는 기능입니다. 예:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. 시간을 가지고 일하기

LocalDateTime클래스 와 마찬가지로 ZonedDateTime클래스에는 날짜 및 시간의 개별 요소를 가져오는 많은 방법이 있습니다. 다음은 이러한 방법의 목록입니다.

int getYear()
특정 날짜의 연도를 반환합니다.
Month getMonth()
날짜의 월을 반환합니다. 여러 상수 중 하나 —JANUARY, FEBRUARY, ...;
int getMonthValue()
날짜의 월 인덱스를 반환합니다. 1월 == 1
int getDayOfMonth()
해당 월의 일 인덱스를 반환합니다.
DayOfWeek getDayOfWeek()
요일을 반환합니다: 여러 상수 중 하나 —MONDAY, TUESDAY, ...;
int getDayOfYear()
해당 연도의 인덱스를 반환합니다.
int getHour()
시간을 반환
int getMinute()
분을 반환합니다.
int getSecond()
초를 반환
int getNano()
나노초를 반환합니다.

모든 메서드는 클래스의 메서드와 완벽하게 유사합니다 LocalDateTime. 물론 이 ZonedDateTime클래스에는 날짜와 시간을 다룰 수 있는 메서드가 있습니다. 즉, 메서드가 호출되는 개체는 변경되지 않습니다. 대신 새 ZonedDateTime객체를 반환합니다.

행동 양식 설명
plusYears(int)
날짜에 연도 추가
plusMonths(int)
날짜에 월을 추가합니다.
plusDays(int)
날짜에 날짜를 추가합니다.
plusHours(int)
시간 추가
plusMinutes(int)
분 추가
plusSeconds(int)
초 추가
plusNanos(int)
나노초 추가
minusYears(int)
날짜에서 연도를 뺍니다.
minusMonths(int)
날짜에서 월을 뺍니다.
minusDays(int)
날짜에서 일을 뺍니다.
minusHours(int)
시간 빼기
minusMinutes(int)
분 빼기
minusSeconds(int)
초 빼기
minusNanos(int)
나노초를 뺍니다

여기서는 방금 고려한 클래스와 유추하여 모든 것이 명확하다고 생각하므로 예제를 제공하지 않습니다.