본문 바로가기

안드로이드

Android - java.time 패키지

반응형

안드로이드에서도 자바 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)

PeriodLocalDate, DurationLocalTime 와 함께 사용하여 시간, 날짜를 이동할 수 도 있다.

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