코드/dev

java dateTime 타임존

미로처럼 2023. 11. 22. 02:19
728x90

일을 하다보면 늘 시간과 관련하여 파싱 혹은 생성할 일이 많다.

자바에서 날짜 혹은 시간을 사용하는 방법을 간략하게나마 정리하기 위해 작성을 하였다.

 

타임존

타임존은 동일한 로컬 시간을 따르는 지역을 의미한다.
보통 구각별로 고유 타임존을 사용하며, 면적이 넓은 나라는 지역 별로 다른 타임존을 사용한다.

 

타임존의 종류 

  • GMT(GreenWich Mean Time)
한국의 타임존은 보통 GMT +09:00으로 표현된다. 영국 그리니치 천문대 기준으로 하는 태양 시간.
  • UTC
지구 자전 주기의 흐름이 늦어지고 있는 문제를 해결한 시간. GMT를 대체하기 위한 새로운 표준. GMT와 아주 미세한 차이인데, 소프트웨어에서 사용할 때는 UTC가 더 정확한 표현이다.
  • Offset
UTC+09:00에서 +09:00의 의미는 UTC 기준 시간보다 9시간 빠르다는 의미이다. 즉, UTC 12시이면, 한국시간으로 9시라는 것이다. 이처럼, UTC와의 차이를 나타낸 것을 Offset이라고 한다.
보통 국가나 지역마다 자신이 사용하는 타임존에 대해 고유 이름을 부여한다. 대한민국의 타임존은 KST(Korea Standard Time)이라고 부른다. KST = UTC+09:00 이라고 이해하면 쉽다.
한 지역의 타임존은 하나 이상의 오프셋을 갖는다. 해당 지역의 정치/경제적 상황에 따라 계속해서 달라질 수 있다.
  • ISO 8610
날짜와 시간 관련된 데이터 교환을 다루는 국제 표준. 국제 표준화 기구(ISO)에 의해 공포되었고, 1988에 처음으로 공개되었다.

 

ex) 2021-07-19T17:40:00+09:00

위 시간을 해석해 보면

  1. Z or +00:00 : UTC 기준시를 나태내는 표시
  2. T : 날짜 뒤에 시간이 오는 것을 표시해주는 문자
  3. 시간(17:40:00) : 시:분:초 형태. 언어에 따라 초 뒤에 소수점 형태로 milliseconds가 표시되기도 한다.
  4. Timezone Offset : 시간 뒤에 +/-시간:분 형태 나타냄
  5. Z or +00:00 : UTC 기준시를 나태내는 표시
// 로컬 시간
2021-07-19T17:40:00.000

*//UTC(GMT)*

2021-07-19T17:40:00.000Z

*//로컬 시간을 의미하면서 UTC(GMT) 대비 +09:00 임을 의미*

2021-07-19T17:40:00.000+09:00

 

java1.8 이전 date

java.util패키지에 Date 클래스가 존재한다. JDK1.0부터 제공되어온 클래스이다. JDK1.1에서는 Calendar 클래스도 나왔다. Calendar 추가 후 Date의 대부분이 deprecated 됐다.

형식화 클래스
java.text 패키지에 포함되어 있으며, 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있다. 객체지향적 설계하여 표준화했다.

 

1.8 이전 가장 자주쓰던 SimpleDateFormat  아래와 같다. 

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

 

 

1.8 이후 Java.time 패키지

기존 java에 있던 Date, Calendar 클래스의 단점을 해소하기 위해 JDK1.8부터 java.time 패키지가 추가되었다.

java.time : 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공
java.time.chrono : 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공
java.time.format : 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공
java.time.temporal : 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공
java.time.zone : 시간대(time-zone)와 관련된 클래스들을 제공


가장 큰 특징은 String 클래스처럼 불변(Immutable) 하다는 것. 그래서 항상 새로운 객체를 반환한다.

 

 

핵심 클래스

  • LocalDateTime
Zone구분 없이 Local 시간을 표시

시간표현 - LocalTime class

날짜표현 - LocalDate class

둘다 표현 시, LocalDateTime을 사용
  • ZondDateTime
Zone을 구분하는 시간을 나타낸다. 2021-07-19T17:40:00.000++09:00[Asia/Seoul]

LocalDateTime + 시간대 : ZonedDateTime 클래스
ZoneId zoneId = ZoneId.of("Asia/Seoul");
//ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zoneDateTime = dateTime.atZone(zoneId);
System.out.println(zoneDateTime); // 2021-07-19T17:40:00.000+09:00[Asia/Seoul]
  • ZoneOffset
UTC로부터 얼만큼 떨어져있는지 ZoneOffset으로 표현한다. 서울은 +9, 미국 뉴욕은 -4이다.
ZoneOffset krOffset = ZonedDateTime.now().getOffset();
int krOffsetInSec = KrOffset.get(ChronoField.OFFSET_SECONDS); // 32400
  • OffsetDateTime
ZonedDateTime은 ZoneId로 구역을 표현하지만, ZoneOffset을 사용하는 것은 OffsetDateTime이다. ZoneId는 일광절약시간 같은 시간대 관련 규칙을 포함하지만 ZoneOffset은 시간의 차이로만 구분한다. 그래서 컴퓨터 통신 간에는 계절별로 시간을 뺏다 더했다 하는 것 보다 안전한 OffsetDateTime을 이용한다.
  • Parsing & Format
java.time.format 패키지에 들어있는 DateTimeFormatter와 parse 메서드를 사용한다.
//Date To String 
LocalDate localDate = LocalDate.of(2021, 7, 19);
String localDateString = DateTimeFormatter.ISO_LOCAL_DATE.format(localDate); // "2021-07-19"
String localDateString = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); // "2021-07-19"
//String To Date
LocalDateTime localDateTime = LocalDateTime.parse("2021-07-19T00:00:00");

위 예시 말고도 날짜를 더하고 비교하는  여러가지가 더 있지만 이정도로 개념적인 정리는 될듯 하다.

 

 

728x90