Programming/Java

Java 날짜와 문자열 LocalDateTime, String 변환하기

Jan92 2022. 1. 8. 00:50

'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으로 정하고, 그로부터 경과된 시간을 양수 또는 음수로 표현하는 방식입니다.

 

 

 

 

< 함께 보면 좋은 자료 >

 

프로그래밍 시간 표현 단위 Unix Time ( = Epoch Time ) 이란

프로그래밍을 하게 되면 '1635083262' 와 같은 형식의 숫자만으로 시간을 표현하는 경우가 있습니다. 이 같은 표현 방식을 Unix Time 또는 Epoch Time 이라고 하는데요. Unix Time, Epoch Time은 부르는 이름만..

wildeveloperetrain.tistory.com

 

 

 

날짜와 시간을 다루는 LocalDate, LocalTime, LocalDateTime (java.time 패키지) 기본 개념

Java 날짜와 시간을 나타내는 Calendar class [Java] 날짜와 시간을 나타내는 Calender class 날짜와 시간은 어떤 프로젝트에서든 뺄 수 없는 데이터입니다. 개발을 하며 앞으로 계속 사용될 날짜와 시간에

wildeveloperetrain.tistory.com

 

 

Java 날짜와 시간을 나타내는 Calendar class

[Java] 날짜와 시간을 나타내는 Calender class 날짜와 시간은 어떤 프로젝트에서든 뺄 수 없는 데이터입니다. 개발을 하며 앞으로 계속 사용될 날짜와 시간에 대해 정리하고 싶어서 공부한 내용을 정

wildeveloperetrain.tistory.com

 

 

< 참고 자료 >

 

Java8+ Instant vs LocalDateTime 각 사용방법

Java 8 이상되면서 Date, Time, Timestamp등이 레거시가 되어버리고 LocalDateTime, ZonedDateTime, LocalTime, Instant 등등이 나왔지만 어디에 적절하게 사용되어야 하는지 적절하게 구분하기 휘애 블로깅을 했씁니

velog.io

 

 

What's the difference between Instant and LocalDateTime?

I know that: Instant is rather a "technical" timestamp representation (nanoseconds) for computing. LocalDateTime is rather date/clock representation including time-zones for humans. Still in the ...

stackoverflow.com