Date and Time 다루기

이번 포스팅에서는 날짜와 시간을 다루는 법에 대해 알아보도록 하겠습니다.

# 안드로이드의 날짜 라이브러리

날짜를 다루기 위해서는 일반적으로 날짜객체를 만들고 그 날짜객체를 자기가 필요로 하는 양식에 맞춰서 표현하도록 하면 되는데요, 이때 사용할 수 있는 날짜 패턴은 다음 표와 같이 여러가지가 있습니다.

Date and Time Pattern Result
“yyyy.MM.dd G ‘at’ HH:mm:ss z” 2001.07.04 AD at 12:08:56 PDT
“EEE, MMM d, ‘‘yy” Wed, Jul 4, ‘01
“h:mm a” 12:08 PM
“hh ‘o’‘clock’ a, zzzz” 12 o’clock PM, Pacific Daylight Time
“K:mm a, z” 0:08 PM, PDT
“yyyyy.MMMM.dd GGG hh:mm aaa” 02001.July.04 AD 12:08 PM
“EEE, d MMM yyyy HH:mm:ss Z” Wed, 4 Jul 2001 12:08:56 -0700
“yyMMddHHmmssZ” 010704120856-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSZ” 2001-07-04T12:08:56.235-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSXXX” 2001-07-04T12:08:56.235-07:00
“YYYY-‘W’ww-u” 2001-W27-3

# 코드 작성

# java.util.Date

그럼 우선은 java.util.Date 라이브러리를 이용해서 날짜객체를 만들어 보겠습니다.

1
2
3
4
5
val utilDate = Date()
println(utilDate.toString())

// 출력
Wed Apr 07 06:48:15 UTC 2021

다음은 이 객체의 표현패턴을 바꿔보겠습니다.

1
2
3
4
5
6
val utilDate = Date()
val formatType = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
println(formatType.format(utilDate))

// 출력
2021-04-07 06:49:17

# java.time

그런데 이 java.util.Date라는 라이브러리는 API level 1 부터 추가된 오래된 라이브러리라 여러 문제도 많고 해서 시간관련 문제를 많이 개선한 java.time 라이브러리를 사용하는 것을 권해드립니다.

날짜객체를 만든 뒤 포매터로 표시형식을 조정하는 것은 동일합니다.

1
2
3
4
5
6
7
val date = LocalDateTime.now()
val dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
val nowString = date.format(dtf)
println(nowString)

// 출력
2021-04-07 06:57:21

# Joda-Time

그런데 문제는 java.time이 API level 26에서 새로 추가된 라이브러리이기 때문에 오레오 미만의 기기에서는 시간을 대응하는 코드를 추가로 준비해야 한다는 점입니다.

이런 경우에 사용할 수 있는 Joda-Time이라는 라이브러리가 있습니다. Joda-Time은 현재 active하게 개발되진 않지만 API level 26 미만에서 정확한 시간을 사용하기에 적절한 라이브러리입니다.

java.time과 공유하여 사용하기 위해서는 다음과 같이 안드로이드 버전을 확인하고 버전에 맞는 라이브러리로 timeDate 객체를 만들어주면 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// gradle에 추가
implementation 'joda-time:joda-time:2.10.10'

val timeDate: String
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val date = LocalDateTime.now()
    val dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    val nowString = date.format(dtf)
    timeDate = nowString
} else {
    val date = org.joda.time.LocalDateTime.now()
    val dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss")
    val jodatime = dtf.parseDateTime(date.toString())
    val nowString = dtf.print(jodatime)
    timeDate = nowString
}

# 두 날짜 사이의 차이 계산하기

그러면 다음은 2000년 1월 1일부터 오늘까지 경과한 날수를 계산해보겠습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
val period: Int
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val startDate = LocalDate.of(2000, 1, 1)
    val todayDate = LocalDate.now()
    val differenceDate = startDate.until(todayDate, ChronoUnit.DAYS) + 1
    period = differenceDate.toInt()
} else {
    val startDate = org.joda.time.LocalDate(2000, 1, 1)
    val todayDate = org.joda.time.LocalDate.now()
    val differenceDate = Days.daysBetween(startDate, todayDate).days + 1
    period = differenceDate
}

이렇게 해서 날짜와 시간을 다루는 법에 대해 알아보았습니다.

Built with Hugo
Theme Stack designed by Jimmy