본문 바로가기

Kotlin

[Kotlin] 날짜 변환(feat. how different between Y and y?)

kotlin에서 날짜를 표현하는 자료형은 2가지가 있습니다

 

java.util.Calendar

java.util.Date

 

두가지 방법 모두 연월일시분초~밀리초까지 표현이 가능하지만 사용법이 조금 다릅니다.

 

1. Date

  date는 연/월/일/시/분/초/요일/밀리초를 다음과 같이 표현할 수 있습니다.

 

val date = Date() // 지금 시간으로 초기화
System.out.println("$date")
System.out.println("${date.year}") // @deprecated   1900년을 0으로 표현
System.out.println("${date.month}" // @deprecated  1월을 0으로 표현
System.out.println("${date.date}") // @deprecated  일자를 그대로 표현
System.out.println("${date.day}") // @deprecated  요일. 월요일을 1로 표현
System.out.println("${date.hours}") // @deprecated  24시간법으로 표현한 시각
System.out.println("${date.minutes}") // @deprecated  분
System.out.println("${date.seconds}") // @deprecated  초
System.out.println("${date.time}") 
// 1970년 1월 1일 자정(UTC) 기준으로 흐른 시간을 밀리세컨드 단위로 표현
// == System.currentTimeMillis()
    

/*** output ***/
Tue May 18 20:18:24 KST 2021
121
4
18
2
20
18
24
1621336704703

그러나 위의 함수중에서 time을 제외한 모든 함수는 deprecated 되어있고, calendar를 사용하는 것을 권장하고 있습니다.

 

 

 

2. Calendar

Calendar 는 연/월/일/시/분/초/요일/밀리초를 표현할 수 있으며 다음과 같이 사용할 수 있습니다

val calendar:Calendar = Calendar.getInstance() // 오늘 날짜로 초기화(2021.5.18)
calendar.get(Calendar.YEAR) // 올해의 연도를 출력 (2021)
calendar.get(Calendar.MONTH) // 올해의 월-1 을 출력(4)
calendar.set(Calendar.DAY_OF_MONTH, 15) // calendar의 일을 15로 바꿈(2021.05.15)
calendar.add(Calendar.DAY_OF_MONTH, 1) // calendar의 일에 1을 더함(2021.05.16)
calendar.time // Date 형으로 변환
calendar.get(Calendar.MILLISECOND) // millisecond 단위로 변환

val date:Date = calendar.time

date와 마찬가지로 month의 시작은 1이 아닌 0입니다. 그점을 유의해서 사용해야 합니다. 이 Calendar는 쉽게 Date 타입이나 millisecond 타입으로 변환이 가능하다는점, add라는 함수를 이용해 연월일시를 상대 값으로 바꿀 수 있기 때문에 다른 날짜 표현 방식보다 세련되게 사용이 가능합니다.

 

calendar를 date 타입으로 바꾸는 방법은 getTime 입니다.

 

 

3. SimpleDateFormat

날짜를 출력할때, 상기 방법의 기본형인 Tue May 18 20:18:24 KST 2021 을 사용할 수 있지만, 출력 방식을 수정 해야 하는 경우가 있습니다. 그 때 date 의 변환을 담당하는 것이 SimpleDateFormat 입니다. 다음과 같이 사용할 수 있습니다.

 

val sdf = SimpleDateFormat("yyyy/MM/dd EEEE HH:mm:ss z", Locale.KOREAN)
println(calendar.time) // Date 타입
println(sdf.format(calendar.time))

/*** out put ***/
Fri Dec 31 00:36:20 KST 2021
2021/12/31 금요일 00:36:20 KST

예시와 패턴은 다음과 같습니다.

 

예시 : Fri Dec 31 00:27:22 KST 2021

문자 요소 영문 표기 한글 표기
G Era designator AD 서기
y Year 2021 2021
yy Year 21 21
yyyy Year 2021 2021
Y Week year 2022 2022
YY Week year 22 22
YYYY Week year 2022 2022
M Month in year (context sensitive) 12 12
MMM Month in year (context sensitive) Dec 12월
L Month in year (standalone form) 12 12
LLL Month in year (standalone form) Dec 12월
w Week in year 1 1
W Week in month 5 5
D Day in year 365 365
d Day in month 31 31
F Day of week in month 5 5
E Day name in week Fri
EEEE Day name in week Friday 금요일
u Day number of week 5 5
a Am/pm marker AM 오전
H Hour in day (0-23) 0 0
k Hour in day (1-24) 24 24
K Hour in am/pm (0-11) 0 0
h Hour in am/pm (1-12) 12 12
m Minute in hour 27 27
s Second in minute 22 22
S Millisecond 481 481
z Time zone KST KST
Z Time zone +0900 +0900
ZZZ Time zone +0900 +0900
X Time zone +09 +09
XXX Time zone +09:00 +09:00

 

4. how different between Y and y?

위의 붉은 글씨를 보면 이상한 사실을 알 수 있습니다. 분명히 날짜는 2021년 12월 31일 (12월 5주차)인데도 불구하고, y는 2021년을, Y는 2022년을 출력하며, W는 5를 출력하는데 w는 1을 출력합니다. 이를 확인하기 위해서 2021년의 12월 달력을 불러오겠습니다

 

[그림1] 2021년 12월 달력

혹시 눈치채셨나요? 2021년 12월 31일의, year(y)은 2021년이지만, 주단위로 따지자면, 해당 주는 2022년의 첫번째 주이기도 합니다. 그러므로 Week year(Y)은 2022년이 되며, 주도, Week in month(W)는 12월의 5번째 주이지만, Week in year(w) 은 2022년의 1번째 주 이기도 합니다.

 

일반적으로 주단위로 연을 세거나, 연단위로 주를 세는 경우는 없으므로, 연을 표시할때는 yyyy 를, 주를 표시할때는 W를 쓰는 것이 좋겠습니다.

'Kotlin' 카테고리의 다른 글

Kotlin (5) - 반복문  (0) 2020.08.08
Kotlin (4) - 조건문  (0) 2020.07.23
Kotlin (3) - Null 제어  (0) 2020.07.19
Kotlin (2) - 함수  (0) 2020.06.12
Kotlin (1) - 변수와 상수  (0) 2020.05.26