안드로이드에서도 자바 8 지원으로 java.time 패키지를 사용할 수 있게 되었다.
이제 문제 덩어리 였던 Calender 버리고 java.time 패키지의
새로운 클래스인 LocalTime
, LocalDate
, LocalDateTime
들을 사용하면 된다.
코드는 전반적으로 joda-time 과 유사한 형태를 이루고 있고,
추가적인 개선이 이루어졌다고 한다.
Java 8 은 gradle 에 아래와 같이 추가 하면 사용할 수 있다.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
날짜, 시간 가져오기
LocalTime.now() // 23:12:50.982
LocalDate.now() // 2020-07-14
LocalDateTime.now() // 2020-07-14T23:12:50.982
이름 그대로 각각 시간, 날짜, 시간+날짜 정보를 가지고 있는 클래스들이다.
now()
함수를 이용하여 현재 시간,날짜를 가져올 수 있다.
LocalTime.of(10,30,30) // 10:30:30
LocalTime.ofSecondOfDay(10 * 60 * 60 + 30 * 60 + 30) // // 10:30:30
LocalDate.of(2015,Month.MAY,20) // 2015-05-20
LocalDate.ofYearDay(2020,10) // 2020-01-10
LocalDateTime.of(2020,10,10,9,15,20) // 2020-10-10T09:15:20
Year.of(2020).atMonth(10).atDay(20).atTime(9, 0,0) // 2020-10-20T09:00
다양한 함수들을 통해서 원하는 시간이나 날짜를 지정하여 생성할 수 있다.
LocalTime.parse("20:10:10") // 20:10:10
LocalTime.parse("20:10:10", DateTimeFormatter.ofPattern("HH:mm:ss")) // 20:10:10
LocalDate.parse("2013,12,25", DateTimeFormatter.ofPattern("yyyy,MM,dd")) // 2013-12-25
LocalDateTime.parse("2020,11,25 20:10:10",DateTimeFormatter.ofPattern("yyyy,MM,dd HH:mm:ss")) // 2020-11-25T20:10:10
기본적인 파싱도 당연히 지원하며 DateTimeFormatter
이용하면 커스텀한 양식도 파싱할 수 있다.
format
으로 String 변환할 때도 DateTimeFormatter
를 이용하여 포맷팅 하면 된다.
파싱 된 결과에 LocalTime
은 시(분, 초는 없어도 됨)만 있으면 되고, LocalDate
은 년,월,일 다 있어야 한다.
LocalDateTime
은 년,월,일,시 만 있으면 된다.
기간, 간격
Period.ofDays(10) // P10D
Period.ofYears(10) // P10Y
Period.ofWeeks(10) // P70D
Duration.ofDays(10) // PT240H
Dation.ofHours(-10) // PT-10H
Duration.ofMinutes(10) // PT10M
시간, 날짜 이외에도 기간, 간격을 나타내는 Period
, Duration
이 추가되었다.
Period
은 년, 월, 일의 값을 가지고,Duration
은 시, 분, 초의 값을 가진다.
각각 변수 ( year, month ... )로 접근하여 가져올 수 있다.
Period.between(LocalDate.of(2020, 1, 30),LocalDate.of(2020, 5, 30)) // P4M
Duration.between(LocalTime.of(10, 30, 30),LocalTime.of(10, 50, 30)) // PT20M
between
함수를 사용하면 두 객체 사이의 기간, 간격을 가져올 수 있다.
대신, Period
은 LocalDate 클래스간의 기간만 구할 수 있고,
Duration
은 LocalTime 클래스간의 간격만 구할 수 있다.
시간, 날짜 이동하기
LocalTime.now().plusHours(10).plusMinutes(10).minusSeconds(10) // 09:45:23.324
LocalDate.now().plusYears(10).plusMonths(10).minusDays(10) // 2031-05-04
LocalDateTime.now().plusYears(10).plusMonths(10).minusDays(10).plusHours(10) // 2031-05-05T09:35:33.325
plusXXX
, minusXXX
형식으로 명확하게 나뉘어져 있어서,
Calender처럼 get, add과 필드 값을 통해서 시간, 날짜를 변경하는 코드는 이제 안 써도 된다.
LocalDate.now().plus(Period.ofYears(10))
LocalTime.now().plus(Duration.ofDays(10))
LocalDate.now().plus(10, ChronoUnit.MONTHS)
Period
는 LocalDate
, Duration
는 LocalTime
와 함께 사용하여 시간, 날짜를 이동할 수 도 있다.
ChronoUnit
클래스를 이용하면 필드 값을 이용하여 이동할 수도 있다.
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SATURDAY)) // 2020-07-18 // 다음 주 토요일
LocalDate.now().with(TemporalAdjusters.previous(DayOfWeek.SATURDAY)) // 2020-07-11 // 지난 주 토요일
LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()) // 2020-07-31 // 이달 말
TemporalAdjusters
클래스를 이용하면 다양한 조건을 통해 날짜 이동이 가능하다.
이달 말, 다음 주 월요일, 두 번째 주 화요일 등 다양한 조건을 위한 함수들이 구현되어 있다.
월, 요일 한글로 표시하기
val localDate = LocalDate.of(2015, Month.MAY, 20)
localDate.month // MAY
localDate.dayOfWeek // WEDNESDAY
localDate.month.getDisplayName(TextStyle.FULL, Locale.KOREA) // 5월
localDate.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREA) // 수요일
localDate.dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.KOREA) // 수
달 Month
, 요일 DayOfWeek
표시를 원하는 언어로 바꾸려면 getDisplayName
함수를 사용하면 된다.
TextStyle
로 스타일을 지정하고, Locale
을 통해서 언어를 선택하면 된다.
'안드로이드' 카테고리의 다른 글
Hilt - @SingletonComponent (0) | 2020.11.16 |
---|---|
Espresso intents - 카메라 촬영 테스트 하기 (0) | 2020.07.17 |
Android Hilt - WorkManager (0) | 2020.07.03 |
Android & Java - Reflection (0) | 2020.07.02 |
Android & Java - Dynamic Proxy (0) | 2020.06.30 |