코틀린에서는 확장 함수를 직접 생성하여 별도의 함수를 호출하며 값을 입력해 줄 필요 없이 값에 바로 확장함수를 사용할 수 있다. 코틀린에서 자주 사용하게 되는 자바의 시간 클래스 중 LocalDateTime은 DatePicker 같은 컴포넌트에서 사용하려면 Long타입의 유닉스 시간으로 값을 변환해 입력해주어야 한다.
Long to LocalDateTime
// Long -> LocalDateTime
fun Long.toLocalDateTime(): LocalDateTime {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(this), ZoneId.systemDefault())
}
Long타입의 유닉스 시간은 1970년 1월 1일로부터 경과 밀리초을 나타내며 이 타입을 LocalDateTime으로 변환하여 년, 월, 일, 분, 초를 사용해 표현할 수 있다.
- 먼저 Long을 LocalDateTime으로 변경해 주는 함수를 제작하기 위해 Long.함수이름(): LocalDateTime 형식으로 확장 함수를 선언해 준다. 해당 확장 함수를 사용한 값은 함수 내부에서 this를 사용해 호출할 수 있다.
- Instant는 UTC 기준의 시간을 나타내며 타임존 정보가 포함되어있지 않다. 참고로 한국은 UTC+09:00이다. Instant는 시간대 정보가 없으므로 로컬 시간대 함께 입력해 주어야 LocalDateTime으로 변환할 수 있다.
- ofInstant 함수의 파라미터로 instant와 zone을 입력해 준다. 예시에서는 시스템의 기본값을 사용하는 ZoneId.systemDefault()를 사용하였고 원하는 국가가 있다면 ZoneId.of("Asia/Seoul")와 같이 입력해 주거나 ZoneId.of("UTC")처럼 기준이 되는 시간대를 입력해 줄 수도 있다.
LocalDateTime to Long
// LocalDateTime -> Long
fun LocalDateTime.toLong(): Long {
return this.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
}
이번에는 반대로 LocalDateTime에서 Long으로 변환하는 방법이다.
- LocalDateTime의 내부 함수인 atZone을 호출해 주고 먼저 ZoneId를 설정해 주면 ZonedDateTime 객체로 변환되게 된다. 이때 주의할 점은 Long에서 LocalDateTime으로 변경할 때 사용했던 ZoneId를 입력해 주어야 동일한 시간으로 다시 변환된다. 예시처럼 동일한 시스템 기본값을 사용하거나 ZoneId.of("Asia/Seoul")를 사용했었다면 반드시 ZoneId.of("Asia/Seoul")를 사용해야 한다.
- 그리고 toInstant()를 사용해 ZonedDateTime를 Instant로 변환해 준 후 toEpochMilli()를 사용해 Long으로 변환시켜 준다.