Работа с датами в Kotlin: обзор библиотек и инструментов
Обработка дат и времени — одна из ключевых задач в любом приложении: от логирования событий до расчёта дедлайнов и отображения календарей. В Kotlin, как в языке, работающем поверх JVM (а также поддерживающем мультиплатформенные проекты), разработчику доступно несколько мощных библиотек. В этой статье мы рассмотрим три основных подхода: kotlinx-datetime (рекомендуемый для мультиплатформы), java.time (для JVM/Android) и Joda-Time (легендарная библиотека, актуальная для старых проектов).
1. kotlinx-datetime — официальная мультиплатформенная библиотека
kotlinx-datetime — это современная библиотека от JetBrains, созданная специально для Kotlin Multiplatform. Она предоставляет единый API для работы с датами, временем, часовыми поясами и длительностями на всех платформах (JVM, JS, Native).
Установка (Gradle)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")
}
Основные классы и примеры
Instant— момент времени (UTC).LocalDateTime— дата+время без часового пояса.LocalDate— только дата.LocalTime— только время.TimeZone— часовой пояс.
import kotlinx.datetime.*
fun main() {
// Текущий момент в UTC
val now: Instant = Clock.System.now()
println("Now UTC: $now")
// Конвертация в локальное время (системный часовой пояс)
val localDateTime: LocalDateTime = now.toLocalDateTime(TimeZone.currentSystemDefault())
println("Local: $localDateTime")
// Работа с датами
val today: LocalDate = localDateTime.date
val tomorrow: LocalDate = today.plus(1, DateTimeUnit.DAY)
println("Tomorrow: $tomorrow")
// Разница между датами
val daysBetween = tomorrow.daysUntil(today)
println("Days between: $daysBetween") // -1
// Парсинг строки
val parsedDate = LocalDate.parse("2025-03-15")
println("Parsed: $parsedDate")
}
2. java.time (ThreeTen-Backport) — стандарт для JVM и Android
Начиная с Java 8, в стандартную библиотеку вошёл пакет java.time (JSR-310). Для Android API < 26 используется ThreeTen-Backport (или ThreeTenABP для Android). Kotlin полностью совместим с этим API.
Установка (для Android с minSdk < 26)
dependencies {
implementation("org.threeten:threetenbp:1.6.9")
}
Примеры
import java.time.*
fun main() {
// Текущая дата и время
val now = LocalDateTime.now()
println("Now: $now")
// Создание конкретной даты
val date = LocalDate.of(2025, Month.DECEMBER, 25)
println("Christmas: $date")
// Форматирование
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
val formatted = now.format(formatter)
println("Formatted: $formatted")
// Разница между датами
val start = LocalDate.of(2025, 1, 1)
val end = LocalDate.of(2025, 12, 31)
val days = ChronoUnit.DAYS.between(start, end)
println("Days in 2025: $days") // 364
}
3. Joda-Time — проверенная временем библиотека
Joda-Time была стандартом де-факто до появления java.time. Сегодня её используют в основном в legacy-проектах. Библиотека предоставляет богатый функционал, но считается устаревшей — рекомендуется мигрировать на java.time или kotlinx-datetime.
Установка
dependencies {
implementation("joda-time:joda-time:2.12.7")
}
Пример
import org.joda.time.*
import org.joda.time.format.DateTimeFormat
fun main() {
val now = DateTime.now()
println("Now: $now")
// Прибавление дней
val nextWeek = now.plusWeeks(1)
println("Next week: $nextWeek")
// Разница в часах
val start = DateTime(2025, 1, 1, 0, 0)
val end = DateTime(2025, 1, 2, 12, 0)
val hours = Hours.hoursBetween(start, end).hours
println("Hours: $hours Также в библиотеке
Helmet для JavaScript (Node.js): полное руководство с примерами
Dependency Injection контейнер для Go (Golang): Wire, Dig и Uber FX
HTTP-клиент для C++: топ библиотек для работы с сетью