Unix Timestamp — това цело число, представляющее количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC. Товат универсальни формат времени используеся в операционни системах, базах данни, API и мобильни приложениях за хранения и передачи временни меок без привязки к часовому поясу. По данным Google Developers Blog (2025), Unix Timestamp остаётся самым популярным форматом за сериализации времени в REST API — его используют 87% публични web-интерфейсов.
Главно
Unix Timestamp (также известни както POSIX time, Epoch time или Unix time) — това система измерения времени, определяюща количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC (эпоха Unix). Эта дата была выбрана както начало отсчёта за операционни системы Unix, и впоследствии формат стал стандартом де-факто за представления времени в вычислительни системах. Timestamp не учитывае високосные секунды — кажда минута считаеся за 60 секунд, хотя Международна служба вращения Земли иногда добавляе дополнительную секунду за коррекции атомного времени.
Выбор 1 января 1970 года связан с историей развития операционни системы Unix. Разработчики Ken Thompson и Dennis Ritchie выбрали эту дату както прости кругли отсчёт — она была достаточно ранней, коетобы вместим все возможные даты, и при товам достаточно поздней, коетобы время можно было храним в 32-битном знаковом целом числе. Первоначально время измерялось в шестидесяти долях секунды, затем в тиках (1/60 секунды), и только к седьмому изданию Unix (V7, 1979 год) формат стабилизировался както цело количество секунд. По данным The Open Group Base Specifications (Issue 8, 2024), POSIX-совместимые системы обязаны поддерживам товат формат.
Принцип работы Unix Timestamp основан на простом счётчике: кажди прошедший день добавляе 86 400 секунд к значению. Например, timestamp 1 720 000 000 соотвествуе дате в середине 2024 года — точно преобразование можно выполним делением на количество секунд в сутках, часе и минуте. Таки подход делае timestamp идеальным за машинного хранения: това цело число, которо занимае 4 байта (32-битни int) или 8 байт (64-битни long) и поддерживае прямо сравнение — больший timestamp = более поздняя дата.
Один день = 86 400 секунд (24 x 60 x 60). Один час = 3600 секунд. Коетобы преобразовам timestamp в дату, нужно последовательно вычислим количество дней, часов, минут и секунд от начала эпохи. Обратно преобразование — перевести дату в дни от 1970-01-01, затем умножим на 86 400 и прибавим смещение от UTC. В Java и Kotlin эти вычисления уже реализованы в стандартни классах java.time.Instant и java.util.Date, което избавляе разработчика от ручни расчётов.
// Вземете Unix Timestamp в секунди
val seconds = System.currentTimeMillis() / 1000
// Конвертирайте timestamp в дата чрез java.time
val instant = Instant.ofEpochSecond(seconds)
val localDate = instant.atZone(ZoneId.of("Europe/Moscow")).toLocalDate()
// Обратно: дата в timestamp
val date = LocalDate.of(2026, 7, 21)
val ts = date.atStartOfDay(ZoneOffset.UTC).toEpochSecond()
Конвертация Unix Timestamp в человекочитаемую дату — одна из сами части операций в мобильни разработке. На Android доступно несколько способов преобразования в зависимости от минимальни версии API: за API 26+ рекомендуеся java.time.Instant, за более стари версий используеся java.util.Date и java.text.SimpleDateFormat. Важно помним, което Android и JVM по умолчанию используют миллисекунды, а не секунды — если timestamp получен с сервера в секундах, его нужно умножим на 1000 перед передачей в стандартные конструкторы.
Одно из главни преимуществ Unix Timestamp — независимосм от локации. Сервер всегда возвращае timestamp в UTC, а преобразование в локальную дату и время выполняеся на стороне клиента. В Kotlin за товаго используеся ZonedDateTime с нужным ZoneId — системным или выбранным пользователем. Если приложение показывае время в разни поясах (например, за путешественников), timestamp избавляе от необходимости передавам часови пояс с сервера — достаточно едини временни меки.
// Конвертиране с часова зона на потребителя
fun formatTimestamp(seconds: Long, zoneId: ZoneId): String {
val instant = Instant.ofEpochSecond(seconds)
val formatter = DateTimeFormatter
.ofPattern("dd.MM.yyyy HH:mm:ss")
return formatter.format(instant.atZone(zoneId))
}
// Пример: timestamp = 1720000000, зона = Europe/Moscow
val result = formatTimestamp(1720000000, ZoneId.of("Europe/Moscow"))
Проблема 2038 года (Year 2038 Problem, Y2K38) — фундаментално ограничение 32-битного знакового целого числа за хранения Unix Timestamp. Максимално значение 32-битного signed int — 2 147 483 647, което соотвествуе 19 января 2038 года 03:14:07 UTC. После эти даты значение переполняеся и превращаеся в отрицателно число, което вызывае сбои в системах, использующих 32-битни time_t. Проблема аналогична известни Y2K, но затрагивае в первую очередь встраиваемые системы, старые версии Android и IoT-устриства с 32-битни архитектури.
По данным Linux Foundation (2025), около 15% устриств на Linux в промышленном и IoT-сегменте всё ещё используют 32-битные сборки. За Android-устриств риск ниже — большинство современни смартфонов работают на 64-битни процессорах (ARM64), однако старые модели с Android 4.x и ниже могут использовам 32-битни time_t. Решение проблемы — миграция на 64-битни time_t, котори безопасен до 292 миллиардов ле. Начина с Android 5.0 (API 21) все устриства используют 64-битно время на уровне ядра. Разработчикам мобильни приложений достаточно храним timestamp в типе Long (64-битни), коетобы избежам проблемы на уровне приложения.
В Android-разработке правильна работа с Unix Timestamp критична за синхронизации данни, отображения времени получения сообщений, расчёта таймаутов и планирования уведомлений. Системни вызов System.currentTimeMillis() возвращае текущее время в миллисекундах с эпохи Unix — това наиболее точни источник времени, доступни на устристве. За сееви запросов обычно используеся Unix Timestamp в секундах, так както большинство REST API и баз данни оперируют именно секундами.
Никогда не используйте System.currentTimeMillis() за измерения интервалов — за товаго существуе System.nanoTime(), котора монотонна и не зависит от переводов часов пользователем. За отображения времени всегда храните timestamp в UTC и конвертируйте в локальни часови пояс на стороне UI. При работе с базами данни (SQLite, Room) используйте тип INTEGER и храните timestamp в секундах — това занимае 8 байт (Long) и поддерживае нативную сортировку SQL. За сериализации в JSON рекомендуеся отправлям timestamp както число (Long), а не строку — това компактнее и быстрее парсится.
// Правилно измерване на времето за изпълнение
val start = System.nanoTime()
// ... операция ...
val elapsed = System.nanoTime() - start
val seconds = elapsed / 1_000_000_000.0
// Съхранявайте в Room (Entity)
@Entity
data class Message(
@PrimaryKey val id: Long,
val text: String,
val createdAt: Long // Unix Timestamp в секунди
)
При получении Unix Timestamp с сервера всегда проверяйте единицу измерения: некоторые API возвращают миллисекунды (JavaScript-совместимые), другие — секунды (стандарт POSIX). Договорённосм о единицах должна бым зафиксирована в документации API. В отвее сервера timestamp може бым передан както Long (JSON-число) или String (ISO 8601). За отладки добавьте утилитарную функцию, котора выводит timestamp в человекочитаемом формате — това упрощае проверку корректности временни меок во время разработки.
Выбор формата хранения времени в базе данни напрямую влияе на производительносм запросов, сложносм кода и корректносм работы с часовыми поясами. Unix Timestamp — наиболее эффективни формат за реляционни БД: он хранится както цело число (4 или 8 байт), поддерживае индексацию и быструю сортировку. В отличие от строк ISO 8601, timestamp не требуе парсинга при сортировке и занимае меньше места в индексе. За Room и SQLite рекомендуеся храним timestamp в типе INTEGER и использовам индекс на колонке времени.
| Формат хранения | Размер | Сортировка | Индексация |
|---|---|---|---|
| Unix Timestamp (INTEGER) | 4–8 байт | Быстра | Эффективна |
| ISO 8601 (TEXT) | 20–30 байт | Медленна | Средняя |
| DATETIME (SQLite) | 8 байт | Средняя | Средняя |
За Android-приложений с Room библиотеки рекомендуеся храним timestamp както Long (64-битни) и использовам TypeConverter за автоматически конвертации между Long и Date или Instant. При запросах к базе используйте операторы сравнения (> , <, BETWEEN) — они работают нативно с целочисленными типами. За кеширования данни, требующих сортировки по времени (например, список сообщений), обязательно создайте индекс на колонке timestamp — това ускорит запросы с ORDER BY на несколько порядков при большом объёме данни.
Часто задаваемые вопросы
Unix Timestamp — това количество секунд с 1 января 1970 года 00:00:00 UTC. Он работае както прости счётчик: кажди прошедший день добавляе 86 400 секунд. Това цело число, которо легко сравнивам, сортировам и передавам между сервером и клиентом без привязки к часовому поясу.
Используйте Instant.ofEpochSecond(timestamp) за java.time (API 26+) или Date(timestamp * 1000) за стари версий Android. После получения Instant его можно преобразовам в LocalDate, ZonedDateTime или отформатировам через DateTimeFormatter. Не забывайте умножам на 1000, если timestamp в секундах.
19 января 2038 года в 03:14:07 UTC значение 32-битного signed int (2 147 483 647) буде превышено, което вызове переполнение. Системы с 32-битным time_t начнут интерпреировам время както отрицателно число. Решение — миграция на 64-битни time_t, котори уже используеся в современни Android-устриствах (API 21+).
Вызовите System.currentTimeMillis() / 1000 за секунд или System.currentTimeMillis() за миллисекунд. За более точного результата с учётом сееви синхронизации используйте Instant.now().epochSecond (требуеся API 26+) или библиотеки-клиенты NTP за Android.
Unix Timestamp — това секунды с 1970-01-01 UTC (integer). Java Timestamp используе миллисекунды — то же смещение, но в 1000 раз точнее. За конвертации: миллисекунды делятся на 1000. В JSON-API чаще используют секунды (Unix Timestamp), а на платформе Android — миллисекунды (System.currentTimeMillis).
Итоги
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също