[Java]LocalDateTime, OffsetDateTime, ZonedDateTime, Instant

타임스탬프를 RFC 3339의 형태로 보내 달라는 요구사항을 받았다. 그리고 어떤 값은 밀리세컨드 단위까지, 어떤 값은 세컨드 값 까지만 전달해 달라는 요구사항을 받았다. 어카지?

ISO 8601

RFC 3339

  • ISO 8601을 인터넷 프로토콜로 어떻게 다룰지 규정한 RFC
  • RFC 3339에서는 'T'의 생략을 허용하지 않고, 날짜와 시간 사이의 공백을 허용한다.

ISO 8601과 RFC 3339의 차이

 

UTC 시간대를 기준으로 여러 포맷이 사용 될 수 있지만 대부분 아래와 같은 형태 일 것이다.

2020–08–28T09:20:26.187+09:00

 


LocalDateTime(LocalDate, LocalTime)

  • 현재 로컬의 시간 정보

//서울
System.out.println(LocalDateTime.now());
2022-03-16T21:26:25.495803
//몬트리올
System.out.println(LocalDateTime.now());
2022-03-16T08:23:38.556553
  • 컴퓨터의 시간을 그대로 나타내주고 있음

 

OffestDateTime

  • 타임존에 대한 정보를 가지고 있다...!
System.out.println(OffsetDateTime.now());
2022-03-16T21:29:11.227296+09:00

 

ZonedDateTime

  • OffestDateTime에서 ZoneRegion에 대한 정보까지 포함
  • +09:00 시간대에 서울특별시-대한민국 말고도, 중국 칭다오나 일본 후쿠오카 같은 지역도 포함된다.

System.out.println(ZonedDateTime.now());
2022-03-16T21:39:36.821077+09:00[Asia/Seoul]

 

Instant

  • 유닉스 시간 : POSIX 시간이나 Eporch 시간이라 부르기도 한다.
    • 1970년 1월 1일 00:00:00 협정 세계시 (UTC)로 부터의 경과 시간을 초로 환산하여 표현한 것 이다.
    • 자바의 System.currentTimeMillis() 현재의 유닉스 시간을 밀리초로 반환한다.
System.out.println(Instant.now());
System.out.println(Instant.ofEpochMilli(System.currentTimeMillis()));
//2022-03-20T16:32:04.204752Z
//2022-03-20T16:32:04.204Z
//현재 한국은 2022-03-21 01:32
  • now()로 하면 나노초 단위까지 계산 밀리초 단위 까지 계산하려면 ofEpochMili()를 사용한다.

 

초 단위 까지만 표기하기

System.out.println(OffsetDateTime.now().withNano(0));
//2022-03-21T01:32:04+09:00
  • withNano(0)시 밀리세컨드 또한 사라진다.
  • OffsetDateTime은 밀리초단위는 컨트롤을 못한다...;

밀리 세컨드 단위 까지 표현하기

System.out.println(OffsetDateTime.ofInstant(Instant.ofEpochMilli(Instant.now().toEpochMilli()), ZoneId.systemDefault()));
System.out.println(OffsetDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()));
//2022-03-21T01:32:04.204+09:00
//2022-03-21T01:32:04.204+09:00
  • Date도 시간을 currentTimeMillis로 가지고 있다.
    public Date() {
        this(System.currentTimeMillis());
    }

 

기존 LocalDateTime을 OffsetDateTime으로 변경하기

System.out.println(localdateTime);
System.out.println(localdateTime.atOffset(OffsetDateTime.now().getOffset()));

//2022-03-21T01:44:52.083033
//2022-03-21T01:44:52.083033+09:00
  • atOffset을 활용해서 offset을 붙혀 줄 수 있다.

'study' 카테고리의 다른 글

서킷브레이커  (0) 2022.04.13
Spring AOP - Transactional, Async  (0) 2022.03.25
[Java]컬렉션(Collections) 정리  (0) 2021.12.02
[Spring]프로토타입과 스코프  (0) 2021.12.02
[DB]트랜잭션 정리  (0) 2021.12.02

댓글



Designed by JB FACTORY