본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

LocalDateTime, ZonedDateTime: now() of() 날짜/시간지정, ZonedId 특정지역, ZoneOffset 일관된 시간대를 구하다

앞서 언급한것과 같이 LocalDate과 LocalTime을 합쳐놓은것이 LocalDateTime, 

LocalDateTime에 시간대를 추가한것이 ZonedDateTime이다.

https://standout.tistory.com/1245#og_1704934959811

 

java.time패키지: 객체생성 now() of() parse()와 인터페이스, 간격을 나타내는 Period Duration

java.time Date와 Calendar가 가지고 있던 단점을 해소하기 위해 java.time패키지가 추가됨. https://standout.tistory.com/1224 Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기 오래전부터 제공되던 Date클래스를 보

standout.tistory.com

 

 

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

 

java.time패키지: 객체생성 now() of() parse()와 인터페이스, 간격을 나타내는 Period Duration

java.time Date와 Calendar가 가지고 있던 단점을 해소하기 위해 java.time패키지가 추가됨. https://standout.tistory.com/1224 Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기 오래전부터 제공되던 Date클래스를 보

standout.tistory.com

 

 

 

 

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

 

NTP와 UTC의 차이

컴퓨터는 어떻게 시간을 표시할까? 에 대해 잠시 생각해보자. 우선 기기마다 시간이 다르면 인간들이 혼란스러울 테니 서로 같은 시간을 동기화하여 보여주고, 각 지역/나라마다 큰 차이가 나지

standout.tistory.com

 

 

 

 

 

 

 

 

위처럼 ZonedDateTime은 ZoneId로 구역을 표현한다.

이때 ZoneId가 아닌 ZoneOffset을 사용하는것이 OffsetDateTime.

ZoneId는 일광절약시간처럼 시간대에 관련된 규칙들을 포함하고있는데

사실 컴퓨터에게 계절별로 시간을 더했다 뺐다하는것은 위험하기 그지없다.

아무런 변화없이 일관된 시간체계를 유지하기 위해 사용된다.

https://standout.tistory.com/1250

 

DST Daylight Saving Time 일광정략시간이란?

DST Daylight Saving Time 일광정략시간 일정기간 동안 시계를 조정하여 낮동안 더 많은 자연광을 이용하고 전기소비를 줄이려는 노력의 하나. 봄부터 가을까지 시계를 한시간 앞으로 조정해 일출/일

standout.tistory.com

 

 

즉 같은 지역내에서는 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

 

Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기

오래전부터 제공되던 Date클래스를 보완하기 위해 Calendar 클래스가 등장. Calendar와 GregorianCalendar GregorianCalendar는 Calendar를 상속받아 구현한 전세계 공통 그레고리력에 맞게 구현한것. // Calendar를

standout.tistory.com