'LocalDateTime to String, String to LocalDateTime'
자바에서는 기존의 Calendar 클래스와 Date 클래스의 불편한 점을 보안하기 위해 JDK1.8부터 java.time API를 도입하였습니다.
java.time 패키지에는 날짜와 시간을 나타내는 LocalDateTime, 날짜를 나타내는 LocalDate, 시간을 나타내는 LocalTime 외에 OffsetDateTime, ZonedDateTime, Instant 등의 클래스들이 있습니다.
(LocalDateTime과 String의 변환에 대해 먼저 살펴보고, 아래에서는 OffsetDateTime, ZonedDateTime, Instant 등 java.time 패키지 내에 시간을 다루는 클래스들에 대해 간단하게 정리하였습니다.)
LocalDateTime (LocalDate + LocalTime)
ISO-8601 캘린더 시스템의 타임존이 없는 날짜-시간 시스템입니다.
Java Time에서 Local이 들어간다는 것은 시간대(Zone Offset / Zone Region)에 대한 정보가 없다는 의미이며, 이 값은 전 세계 모든 시간대에서 본다면 순간이 아닌 범위 값을 가지게 됩니다.
2022-01-06T15:16:30.431 (기본적인 형식)
한국에서 '2022-01-07T21:32:11'인 LocalDateTime을 미국으로 들고 가도 '2022-01-07T21:32:11' 그대로입니다. 때문에 생일이나 기념일 같은 경우에 적용할 수 있습니다.
LocalDateTime, String 변환
LocalDateTime을 사용하다 보면 LocalDateTime Type의 값을 다른 형태의 String으로 응답해줘야 한다거나, "202201071157" 같은 문자열을 LocalDateTime Type으로 변환해서 사용해야 하는 경우가 많이 있습니다.
// LocalDateTime to String
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime : " + localDateTime);
// localDateTime : 2022-01-07T23:37:29.536
String convertedDate1 = localDateTime.format(DateTimeFormatter.ofPattern("yyyy년 MM월 dd일 HH:mm:ss"));
System.out.println("convertedDate1 : " + convertedDate1);
// convertedDate1 : 2022년 01월 07일 23:37:29
String convertedDate2 = localDateTime.format(DateTimeFormatter.ofPattern("MM월 dd일 E요일"));
System.out.println("convertedDate2 : " + convertedDate2);
// convertedDate2 : 01월 07일 금요일
String convertedDate3 = localDateTime.format(DateTimeFormatter.ofPattern("a KK:mm:ss"));
System.out.println("convertedDate3 : " + convertedDate3);
// convertedDate3 : 오후 11:37:29
먼저 LocalDateTime 값을 문자열 String으로 변환하는 방법입니다.
예시와 같이 DateTimeFormatter 클래스의 ofPattern() 메서드를 통해 원하는 포맷을 적용한 객체를 만들고, LocalDateTime 클래스의 format() 메서드를 통해 문자열 형식으로 변환할 수 있습니다.
이때 일반적인 'yyyyMMdd HHmmss'가 아닌 새로운 'E', 'KK' 같은 것을 볼 수 있는데요.
'E'는 요일을 나타낼 수 있고, 'KK'는 12시간 기준으로 시간을 표현할 수 있는데 더 자세한 변환 방법은 아래 'DataTimeFormatter' 문서를 를 참고하시면 더 자세하게 볼 수 있습니다.
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
// String to LocalDateTime
String strDate1 = "202201061515";
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
LocalDateTime strToLocalDateTime1 = LocalDateTime.parse(strDate1, format1);
System.out.println("strToLocalDateTime1 : " + strToLocalDateTime1);
// strToLocalDateTime1 : 2022-01-06T15:15
String strDate2 = "2022년 01월 05일 15시 10분";
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일 HH시 mm분");
LocalDate strToLocalDateTime2 = LocalDate.parse(strDate2, format2);
System.out.println("strToLocalDateTime2 : " + strToLocalDateTime2);
// strToLocalDateTime2 : 2022-01-05T15:10
반대로 String을 LocalDateTime 또는 LocalDate로 변환하는 방법입니다.
마찬가지로 DateTimeFormatter 클래스의 ofPattern() 메서드를 통해서 원하는 포맷을 적용한 객체를 만들고, LocalDate 클래스의 parse() 메서드를 통해 문자열 형식의 날짜를 LocalDateTime 타입으로 바꿀 수 있습니다.
(만약 "20220105"처럼 "yyyyMMdd"의 형태라면 LocalDateTime이 아닌 LocalDate 타입으로 바꿔야 합니다.)
(추가)
OffsetDateTime (LocalDateTime + ZoneOffset)
ZoneOffset은 UTC 기준으로 시간(Time Offset)을 나타낸 것을 말하며, 우리나라는 KST(Korea Standard Time)를 사용하는데 KST는 UTC 보다 9시간 빠르기 때문에 'UTC +09:00'으로 표기합니다.
ISO-8601 캘린더 시스템에서 UTC로부터 Offset이 포함된 날짜와 시간 (2022-01-07T21:32:11+09:00)
ZonedDateTime(OffsetDateTime + ZoneRegion)
앞의 OffsetDateTime에 ZoneRegion을 더한 것으로 ZoneRegion은 Time Zone을 나타내는 것으로 'Asia/Seoul' 같은 지명 값을 가집니다.
ISO-8601 캘린더 시스템에서 Asia/Seoul 같은 타임존이 포함된 날짜와 시간 (2022-01-07T21:32:11+09:00 Asia/Seoul)
Instant
타임라인의 한 순간을 나타내는 클래스로 특정 시점의 날짜와 시간을 나노초(nanosecond) 단위로 표현하는 Timestamp를 다루는 데 사용됩니다. (Epoch Time으로부터 경과된 시간을 나노초 단위로 표현하며, 항상 UTC를 기준으로 합니다.)
(나노초 단위의 표현으로 인해 기존 integer type의 범위로 인한 Unix Timestamp의 Year 2038 문제를 해결할 수 있습니다.)
***
타임스탬프는 UTC 기준으로 1970년 1월 1일 0시 0분 0초를 숫자 0으로 정하고, 그로부터 경과된 시간을 양수 또는 음수로 표현하는 방식입니다.
< 함께 보면 좋은 자료 >
< 참고 자료 >
'Programming > Java' 카테고리의 다른 글
전문통신이란? Java 전문통신(Fixed Length Format) 문자열 길이 맞추는 메서드 (2) | 2022.01.19 |
---|---|
Java 대출 이자 계산기 구현하기 (원금균등, 원리금균등, 만기일시) (0) | 2022.01.13 |
자바 추상 클래스와 인터페이스의 차이점 이해하기 (2) | 2022.01.06 |
메소드 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이 이해하기 (0) | 2022.01.03 |
자바 예외 처리 방법과 CheckedException, UncheckedException (0) | 2021.12.30 |