앞서 언급한것과 같이 LocalDate과 LocalTime을 합쳐놓은것이 LocalDateTime,
LocalDateTime에 시간대를 추가한것이 ZonedDateTime이다.
https://standout.tistory.com/1245#og_1704934959811
LocalDate와 LocalTime을 합쳐 하나의 LocalDateTime을 만들 수 있다.
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
// LocalDate 객체 생성
LocalDate date = LocalDate.of(2023, 1, 15);
// LocalTime 객체 생성
LocalTime time = LocalTime.of(15, 30, 45);
// LocalDate와 LocalTime을 합쳐서 새로운 LocalDateTime 객체 생성
LocalDateTime combinedDateTime = LocalDateTime.of(date, time);
System.out.println("결합된 LocalDateTime: " + combinedDateTime);
//결합된 LocalDateTime: 2023-01-15T15:30:45
}
}
LocalDateTime도 of()로 날짜/시간을 직접 지정할 수 있다.
// 직접 날짜와 시간을 지정하여 LocalDateTime 객체 생성
LocalDateTime customDateTime = LocalDateTime.of(2023, 1, 15, 15, 30, 45);
System.out.println("직접 지정된 LocalDateTime: " + customDateTime);
//직접 지정된 LocalDateTime: 2023-01-15T15:30:45
https://standout.tistory.com/1245?category=1001092#code_1704935402921
LocalDateTime에 시간대를 추가한것이 ZonedDateTime
LocalDateTime으로 ZonedDateTime을 만들어보자.
ZonedId는 특정지역 국가의 표준시간대를 나타내기 위해 사용된다.
ZonedId 를 사용해 특정지역의 시간대를 지정하고, localDateTime에 atZoned로 ZonedDateTime객체로 변환할 수 있다.
// LocalDateTime 객체 생성
LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 15, 15, 30, 45);
// ZoneId를 사용하여 ZonedDateTime으로 변환
ZoneId zoneId = ZoneId.of("Asia/Seoul");
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
추가로
LocalDate에 atStartOfDay라는 메서드를 통해서도 ZoneId를 지정해 ZonedDateTime을 얻을 수 있다.
// LocalDate 객체 생성
LocalDate localDate = LocalDate.of(2023, 1, 15);
// ZoneId를 사용하여 ZonedDateTime으로 변환
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
ZonedDateTime zonedDateTime = localDate.atStartOfDay(zoneId);
System.out.println("ZonedDateTime으로 변환된 시간: " + zonedDateTime);
//ZonedDateTime으로 변환된 시간: 2023-01-15T00:00+09:00[Asia/Tokyo]
만일현재시간이필요하다면 ZonedDateTime.now(), 날짜/시간을 지정한다면 of()를 사용한다.
ZonedDateTime currentDateTime = ZonedDateTime.now();
System.out.println("현재 시간대의 ZonedDateTime: " + currentDateTime);
//현재 시간대의 ZonedDateTime: 2024-01-15T09:00:00.123456Z[UTC]
LocalDateTime customDateTime = LocalDateTime.of(2023, 1, 15, 15, 30, 45);
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
ZonedDateTime customZonedDateTime = ZonedDateTime.of(customDateTime, zoneId);
System.out.println("지정된 시간대의 ZonedDateTime: " + customZonedDateTime);
//지정된 시간대의 ZonedDateTime: 2023-01-15T15:30:45+09:00[Asia/Tokyo]
ZonedOffSet
UTC로부터 얼마만큼 떨어져있는지를 표현한다.
한국시간대는 UTC+9:00
// UTC로부터 +9:00 시간대의 ZoneOffset 생성
ZoneOffset zoneOffset = ZoneOffset.of("+09:00");
// ZoneOffset을 사용하여 OffsetDateTime 생성
OffsetDateTime offsetDateTime = OffsetDateTime.now().withOffsetSameInstant(zoneOffset);
System.out.println("현재 시간대의 OffsetDateTime: " + offsetDateTime);
//현재 시간대의 OffsetDateTime: 2024-01-15T15:30:45+09:00
https://standout.tistory.com/74
위처럼 ZonedDateTime은 ZoneId로 구역을 표현한다.
이때 ZoneId가 아닌 ZoneOffset을 사용하는것이 OffsetDateTime.
ZoneId는 일광절약시간처럼 시간대에 관련된 규칙들을 포함하고있는데
사실 컴퓨터에게 계절별로 시간을 더했다 뺐다하는것은 위험하기 그지없다.
아무런 변화없이 일관된 시간체계를 유지하기 위해 사용된다.
https://standout.tistory.com/1250
즉 같은 지역내에서는 LocalDateTime이면 충분하나,
서로 다른 시간대에 존재한다면 통신에는 OffsetDateTime이 필요하겠다.
OffsetDateTime는 LocalDate와 LocalTime에 ZonedOffset을 더하거나
ZonedDateTime에 toOffsetDateTime()을 호출해서 얻을 수 있다.
// LocalDate와 LocalTime 생성
LocalDate localDate = LocalDate.of(2023, 1, 15);
LocalTime localTime = LocalTime.of(15, 30, 45);
// ZoneOffset 생성 (예: UTC+09:00)
ZoneOffset zoneOffset = ZoneOffset.of("+09:00");
// LocalDate와 LocalTime에 ZoneOffset을 더하여 OffsetDateTime 생성
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDate, localTime, zoneOffset);
System.out.println("OffsetDateTime 객체: " + offsetDateTime);
//OffsetDateTime 객체: 2023-01-15T15:30:45+09:00
// LocalDateTime 생성
LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 15, 15, 30, 45);
// ZoneId 생성 (예: Asia/Tokyo)
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
// LocalDateTime에 ZoneId를 적용하여 ZonedDateTime 생성
OffsetDateTime offsetDateTime = localDateTime.atZone(zoneId).toOffsetDateTime();
System.out.println("OffsetDateTime 객체: " + offsetDateTime);
//OffsetDateTime 객체: 2023-01-15T15:30:45+09:00
ZonedDateTime 또한 다른 클래스로 변환하는 메서드를 가지고있다.
LocalDate toLocalDate()
import java.time.LocalDate;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 LocalDate로 변환
LocalDate localDate = zonedDateTime.toLocalDate();
System.out.println("LocalDate: " + localDate); //LocalDate: 2024-01-15
}
}
LocalTime toLocalTime()
import java.time.LocalTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 LocalTime으로 변환
LocalTime localTime = zonedDateTime.toLocalTime();
System.out.println("LocalTime: " + localTime); //LocalTime: 15:30:45
}
}
LocalDateTime toLocalDateTime()
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 LocalDateTime으로 변환
LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
System.out.println("LocalDateTime: " + localDateTime); //LocalDateTime: 2024-01-15T15:30:45
}
}
OffsetDateTime toOffsetDateTime()
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 OffsetDateTime으로 변환
OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
System.out.println("OffsetDateTime: " + offsetDateTime); //OffsetDateTime: 2024-01-15T15:30:45+09:00
}
}
long toEpochSecond()
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 초 단위의 long 값으로 변환
long epochSecond = zonedDateTime.toEpochSecond();
System.out.println("Epoch Second: " + epochSecond); //Epoch Second: 1642213845
}
}
Instant toInstant ()
import java.time.Instant;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// ZonedDateTime을 Instant로 변환
Instant instant = zonedDateTime.toInstant();
System.out.println("Instant: " + instant); //Epoch Second: 1642213845
}
}
앞서 언급한것처럼 ZonedDateTime은 GregorianCalendar와 가장 유사하다.
이 둘은 변환될 수 있다.
// GregorianCalendar 생성
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
// GregorianCalendar를 ZonedDateTime으로 변환
ZonedDateTime zonedDateTime = gregorianCalendar.toZonedDateTime();
System.out.println("ZonedDateTime 객체: " + zonedDateTime);
//ZonedDateTime 객체: 2024-01-15T16:56:23.123456789+09:00[Asia/Tokyo]
https://standout.tistory.com/1224