Как получить timestamp в Android на Kotlin: полный гайд

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

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

Начать курс

Android Get Current Timestamp на Kotlin: от новичка до профессионала

Вы когда-нибудь задумывались, как ваш смартфон знает точное время, когда вы отправляете сообщение, делаете фото или запускаете таймер? В основе этой магии лежит timestamp — цифровая метка, которая фиксирует момент с точностью до миллисекунды. Если вы пишете приложение под Android на Kotlin, рано или поздно вам придётся столкнуться с задачей: "Android get current timestamp".

Этот вопрос — один из самых популярных на Stack Overflow (тысячи просмотров!). И неудивительно: кажется, что всё просто, но на практике новички тонут в путанице между миллисекундами, секундами, часовыми поясами и устаревшими классами. В этой статье мы разберём все способы получить текущий timestamp в Android на Kotlin — от базовых до продвинутых. Вы узнаете, какой метод выбрать для вашей задачи и как избежать типичных ошибок.

Что такое timestamp и зачем он нужен в Android?

Timestamp (временная метка) — это число, которое представляет собой количество времени, прошедшее с определённой точки отсчёта. Чаще всего используется Unix timestamp — количество миллисекунд (или секунд) с 1 января 1970 года 00:00:00 UTC. Зачем это нужно в Android?

  • Логирование событий — фиксация действий пользователя.
  • Синхронизация данных — отправка времени на сервер.
  • Кэширование — проверка устаревания данных.
  • Анимации и таймеры — расчёт прошедшего времени.
  • Базы данных — сортировка записей по времени.

В Android разработке на Kotlin у вас есть несколько инструментов для получения timestamp. Давайте рассмотрим их от простого к сложному.

Способ 1: System.currentTimeMillis() — классика жанра

Самый простой и быстрый способ получить текущий timestamp в миллисекундах — использовать System.currentTimeMillis(). Этот метод есть в Java и полностью доступен в Kotlin.

val currentTimestampMillis = System.currentTimeMillis()
println("Текущий timestamp (мс): $currentTimestampMillis")

Плюсы:

  • Молниеносная скорость (нативный вызов).
  • Не требует дополнительных импортов.
  • Работает на всех версиях Android.

Минусы:

  • Возвращает только миллисекунды.
  • Привязан к системному времени устройства (пользователь может его изменить).
  • Не учитывает часовые пояса — это просто число.

Этот метод идеален для измерения интервалов (например, время выполнения кода) или когда вам нужно быстрое число для сравнения.

Способ 2: Instant.now() — современный подход (Java 8+)

Начиная с API уровня 26 (Android 8.0) и выше, вы можете использовать класс java.time.Instant. Это часть современного API времени, который решает многие проблемы старых классов.

import java.time.Instant

val instant = Instant.now()
val timestampMillis = instant.toEpochMilli()
val timestampSeconds = instant.epochSecond

println("Instant: $instant")
println("Timestamp (мс): $timestampMillis")
println("Timestamp (сек): $timestampSeconds")

Плюсы:

  • Чистый, современный API.
  • Легко конвертируется в другие форматы.
  • Работает с UTC по умолчанию.

Минусы:

  • Требует API 26+ (для старых устройств нужна desugaring или библиотека ThreeTenABP).

Если ваше приложение нацелено на современные устройства, Instant.now() — лучший выбор для получения timestamp.

Способ 3: Calendar — устаревший, но живучий

Класс java.util.Calendar — старый способ, который до сих пор встречается в legacy-коде. Его не рекомендуют для нового кода, но вы обязаны знать о нём.

import java.util.Calendar

val calendar = Calendar.getInstance()
val timestampMillis = calendar.timeInMillis

println("Timestamp из Calendar (мс): $timestampMillis")

Плюсы:

  • Работает на всех версиях Android.
  • Позволяет легко получать отдельные компоненты (день, месяц, год).

Минусы:

  • Медленнее, чем System.currentTimeMillis().
  • Мутабельный (не потокобезопасный).
  • Считается устаревшим (deprecated в пользу java.time).

Используйте этот способ только если поддерживаете очень старый код или API.

Способ 4: Date() — ещё один старый друг

Класс java.util.Date также может дать timestamp.

import java.util.Date

val date = Date()
val timestampMillis = date.time

println("Timestamp из Date (мс): $timestampMillis")

По сути, это то же самое, что и System.currentTimeMillis(), но в обёртке объекта. Не имеет преимуществ, кроме совместимости со старым кодом.

Способ 5: Точный timestamp для отладки — System.nanoTime()

Если вам нужно измерить очень маленькие интервалы (например, производительность алгоритма), используйте System.nanoTime(). Важно: это не timestamp в обычном смысле — он не привязан к реальному времени, а только к моменту запуска системы.

val startTime = System.nanoTime()
// ... ваш код ...
val endTime = System.nanoTime()
val durationMs = (endTime - startTime) / 1_000_000.0
println("Время выполнения: $durationMs мс")

Для замеров производительности — это лучший выбор.

Как получить timestamp в секундах?

Иногда серверы ожидают timestamp в секундах, а не в миллисекундах. Просто разделите значение на 1000:

val millis = System.currentTimeMillis()
val seconds = millis / 1000L
println("Timestamp в секундах: $seconds")

Или используйте Instant.now().epochSecond (см. способ 2).

Преобразование timestamp в читаемую дату

Получить число — это половина дела. Часто нужно показать пользователю понятную дату. Вот как это сделать на Kotlin:

С использованием java.time (API 26+)

import java.time.Instant
import java.time.ZoneId
import java.time.format.DateTimeFormatter

val timestamp = System.currentTimeMillis()
val instant = Instant.ofEpochMilli(timestamp)
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")
    .withZone(ZoneId.of("Europe/Moscow"))
val readableDate = formatter.format(instant)

println("Читаемая дата: $readableDate")

С использованием SimpleDateFormat (устаревший)

Блоги

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