본문 바로가기
Java

날짜 포맷 하위호환(기록용)

by ybs 2022. 1. 4.
반응형

java.util.Date 객체를 활용해 Date 객체를 생성하면 기본적으로 출력되는 날짜 형식은 아래와 같다.

Tue Jan 04 18:03:23 KST 2022

 

레거시 프로젝트 로그 포맷의 날짜 형식이 위와 같았고, 신규 프로젝트에서도 로그 포맷을 똑같이 맞춰줘야 했다. 왜냐하면 해당 로그를 모니터링하는 부서가 따로 있고 로그를 파싱해서 분석하는 툴을 갖고 있는데 내부적으로 툴 수정이 어려운 상황이었다.

 

신규 프로젝트에서는 Date 대신 LocalDateTime 과 DateTimeFormatter 를 사용해서 하위호환을 맞췄다.

LocalDateTime
	.of(2022,1,4,18,3,23)
	.atZone(ZoneId.of("Asia/Seoul"))
	.format(DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH));

 

자바 테스트 코드

String localDateTime = LocalDateTime
	.of(2022,1,4,18,3,23)
	.atZone(ZoneId.of("Asia/Seoul"))
	.format(DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH));


Calendar cal = Calendar.getInstance();
cal.set(2022, Calendar.JANUARY, 4, 18, 3, 23);
Date date = cal.getTime();

assertThat(localDateTime).isEqualTo(date.toString());

 

코틀린 테스트 코드

val localDateTime = LocalDateTime
    .of(2022, 1, 4, 18, 3, 23)
    .atZone(Times.LOCAL_ZONE_ID)
    .format(DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH))

val calendar = Calendar.getInstance()
calendar.set(2022, Calendar.JANUARY, 4, 18, 3, 23)
val date = calendar.time

assertThat(localDateTime).isEqualTo(date.toString())

 

자바 코드를 코틀린으로 변환하면서 특이한 부분 하나 발견했다. 인텔리제이가 set 메서드를 replace 'set' call with indexing operator kotlin 메세지와 함께 변환을 해줄 수 있다. set 인자값을 [] 안의 값으로 받을수 있는데 마지막 인자가 = 기호로 표현되는게 특이했다.

calendar.set(2022, Calendar.JANUARY, 4, 18, 3, 23)

// 같음. kotlin indexed access operator
cal[2022, Calendar.JANUARY, 4, 18, 3] = 23

 

반응형