Работа с датами в Kotlin: библиотеки и инструменты (Kotlinx-datetime, Joda-Time, java.time)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в 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                    

Рекомендаций