Unix Timestamp — 1 yanvar 1970-ci il 00:00:00 UTC-dən etibarən keçən saniyələrin sayını təmsil edən tam ədəddir. Bu universal vaxt formatı əməliyyat sistemlərində, verilənlər bazalarında, API-lərdə və mobil tətbiqlərdə vaxt işarələrinin saat qurşağına bağlı olmadan saxlanması və ötürülməsi üçün istifadə olunur. Google Developers Blog (2025) məlumatlarına görə, Unix Timestamp REST API-də vaxtın seriallaşdırılması üçün ən populyar format olaraq qalır — ondan ictimai veb interfeyslərin 87%-i istifadə edir.
Əsas məqamlar
Unix Timestamp (həmçinin POSIX time, Epoch time və ya Unix time kimi tanınır) — 1 yanvar 1970-ci il 00:00:00 UTC-dən (Unix dövrü) keçən saniyələrin sayını təyin edən vaxt ölçmə sistemidir. Bu tərix Unix əməliyyat sistemi üçün başlanğıc nöqtəsi kimi seçilmiş və sonradan bu format hesablama sistemlərində vaxtın təmsili üçün de-fakto standarta çevrilmişdir. Timestamp artıq saniyələri nəzərə almır — hər dəqiqə 60 saniyə hesab olunur, baxmayaraq ki, Beynəlxalq Yer Fırlanma Xidməti bəzən atom vaxtını korreksiya etmək üçün əlavə saniyə əlavə edir.
1 yanvar 1970-ci ilin seçilməsi Unix əməliyyat sisteminin inkişaf tarixi ilə bağlıdır. Tərtibatçılar Ken Thompson və Dennis Ritchie bu tərixi sadə bir dəyirmi başlanğıc nöqtəsi kimi seçdilər — o, bütün mümkün tərixləri əhatə etmək üçün kifayət qədər erkən və eyni zamanda vaxtı 32-bit işarəli tam ədəddə saxlamaq üçün kifayət qədər gec idi. Əvvəlcə vaxt saniyənin altmışda bir hissəsində, sonra tik lərdə (1/60 saniyə) ölçülür və yalnız Unix-in yeddinci nəşrində (V7, 1979) format tam saniyə sayı kimi sabitləşmişdir. The Open Group Base Specifications (Issue 8, 2024) məlumatlarına görə, POSIX-uyğun sistemlər bu formatı dəstəkləməlidir.
Unix Timestamp-in işləmə prinsipi sadə sayıcıya əsaslanır: hər keçən gün dəyərə 86 400 saniyə əlavə edir. Məsələn, timestamp 1 720 000 000 2024-cü ilin ortalarındakı bir tərixə uyğunda gəlir — dəqiq çevrilmə gün, saat və dəqiqədəki saniyə sayına bölməklə aparıla bilər. Bu yanaşma timestamp-i maşin saxlanması üçün ideal edir: bu, 4 bayt (32-bit int) və ya 8 bayt (64-bit long) tutan və birbaşa müqayisəni dəstəkləyən tam ədəddir — böyük timestamp = daha gec tərix.
Bir gün = 86 400 saniyə (24 x 60 x 60). Bir saat = 3600 saniyə. Timestamp-i tarixə çevirmək üçün dövrün əvvəlindən günlərin, saatların, dəqiqələrin və saniyələrin sayını ardıcıl olaraq hesablamaq lazımdır. Tərs çevirmə — tərixi 1970-01-01-dən günlərə çevirmək, sonra 86 400-ə vurmaq və UTC-yə nisbətən yerdəyişməni əlavə etməkdir. Java və Kotlin-də bu hesablamalar artıq java.time.Instant və java.util.Date standart siniflərində tətbiq edilmişdir ki, bu da tərtibatçını əl hesablamalarından azad edir.
// Unix Timestamp-i saniyələrlə əldə edin
val seconds = System.currentTimeMillis() / 1000
// Timestamp-i java.time vasitəsilə tarixə çevirin
val instant = Instant.ofEpochSecond(seconds)
val localDate = instant.atZone(ZoneId.of("Europe/Moscow")).toLocalDate()
// Tərsi: tarixdən timestamp-ə
val date = LocalDate.of(2026, 7, 21)
val ts = date.atStartOfDay(ZoneOffset.UTC).toEpochSecond()
Unix Timestamp-in insan tərəfindən oxuna bilən tarixə çevrilməsi mobil inkişafda ən çox yayılmış əməliyyatlardan biridir. Android-də minimum API versiyasından asılı olaraq bir neçə çevirmə üsulu mövcuddur: API 26+ üçün java.time.Instant tövsiyə olunur, köhnə versiyalar üçün java.util.Date və java.text.SimpleDateFormat istifadə olunur. Yadda saxlamaq vacibdir ki, Android və JVM standart olaraq millisaniyələrdən istifadə edir, saniyələrdən yox — əgər timestamp serverdən saniyələrlə alınıbsa, standart konstruktorlara ötürməzdən əvvəl onu 1000-ə vurmaq lazımdır.
Unix Timestamp-in əsas üstünlüklərindən biri yerləşmədən asılı olmamasıdır. Server həmişə timestamp-i UTC-də qaytarır, lokal tarix və vaxta çevirmə isə müştəri tərəfində aparılır. Kotlin-də bunun üçün müvafiq ZoneId ilə ZonedDateTime istifadə olunur — sistem və ya istifadəçi tərəfindən seçilmiş. Əgər tətbiq müxtəlif qurşaqlarda vaxtı göstərirsə (məsələn, səyyahlar üçün), timestamp serverdən saat qurşağını ötürmək zörurətini aradan qaldırır — vahid vaxt işarəsi kifayətdir.
// İstifadəçinin saat qurşağı ilə konvertasiya
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))
}
// Nümunə: timestamp = 1720000000, zona = Europe/Moscow
val result = formatTimestamp(1720000000, ZoneId.of("Europe/Moscow"))
2038-ci il problemi (Year 2038 Problem, Y2K38) — Unix Timestamp-in saxlanması üçün 32-bit işarəli tam ədədin fundamental məhdudiyyətidir. 32-bit signed int-in maksimal dəyəri 2 147 483 647-dir, bu da 19 yanvar 2038-ci il 03:14:07 UTC-yə uyğundur. Bu tərixdən sonra dəyər daşır və mənfi ədədə çevrilir, bu da 32-bit time_t istifadə edən sistemlərdə nasazlıqlara səbəb olur. Problem məşhur Y2K-yə bənzəyir, lakin ilk növbədə daxili sistemlərə, köhnə Android versiyalarına və 32-bit arxitekturalı IoT cihazlarına təsir edir.
Linux Foundation (2025) məlumatlarına görə, sənaye və IoT seqmentindəki Linux cihazlarının təxminən 15%-i hələ də 32-bit qurğularından istifadə edir. Android cihazları üçün risk daha aşağıdır — müasir smartfonların əksəriyyəti 64-bit prosessorlarda (ARM64) işləyir, lakin Android 4.x və daha köhnə modellər 32-bit time_t istifədə edə bilər. Problemin həlli — 292 milyard il təhlükəsiz olan 64-bit time_t-a miqrasiyadır. Android 5.0-dən (API 21) başlayaraq bütün cihazlar nüvə səviyyəsində 64-bit vaxtdan istifadə edir. Mobil tətbiq tərtibatçılarına problemdən qaçmaq üçün timestamp-i Long (64-bit) tipində saxlamaq kifayətdir.
Android inkişafında Unix Timestamp ilə düzgün işləmə məlumatların sinxronizasiyası, mesajların qəbul vaxtının göstərilməsi, vaxt limitlərinin hesablanması və bildirişlərin planlaşdırılması üçün kritik əhəmiyyət kəsb edir. System.currentTimeMillis() sistem çağırışı cari vaxtı Unix dövründən millisaniyələrlə qaytarır — bu, cihazda mövcud olan ən dəqiq vaxt mənbəyidir. Şəbək sorğuları üçün adətən Unix Timestamp saniyələrlə istifadə olunur, çünki REST API və verilənlər bazalarının əksəriyyəti məhz saniyələrlə işləyir.
Heç vaxt intervalları ölçmək üçün System.currentTimeMillis() istifadə etməyin — bunun üçün System.nanoTime() var, o monotonikdir və istifadəçinin saat dəyişikliklərindən asılı deyil. Vaxtı göstərmək üçün həmişə timestamp-i UTC-də saxlayın və interfeys tərəfində lokal saat qurşağına çevirin. Verilənlər bazaları ilə işlərkən (SQLite, Room) INTEGER tipindən istifadə edin və timestamp-i saniyələrlə saxlayın — bu, 8 bayt (Long) tutur və SQL-in yerli çeşidini dəstəkləyir. JSON seriallaşdırması üçün timestamp-i sətir kimi deyil, ədəd (Long) kimi göndərmək tövsiyə olunur — bu, daha yığcam və daha sürətli parse olunur.
// Düzgün icra vaxtı ölçümü
val start = System.nanoTime()
// ... əməliyyat ...
val elapsed = System.nanoTime() - start
val seconds = elapsed / 1_000_000_000.0
// Room-da saxla (Entity)
@Entity
data class Message(
@PrimaryKey val id: Long,
val text: String,
val createdAt: Long // Unix Timestamp saniyələrlə
)
Serverdən Unix Timestamp qəbul edərkən həmişə ölçü vahidini yoxlayın: bəzi API-lər millisaniyələr qaytarır (JavaScript-uyğun), digərləri isə saniyələr (POSIX standartı). Vahidlər barədə razılaşma API sənədləşməsində qeyd edilməlidir. Server cavabında timestamp Long (JSON ədədi) və ya String (ISO 8601) kimi ötürülə bilər. Debug üçün timestamp-i insan tərəfindən oxuna bilən formatda göstərən köməkçi funksiya əlavə edin — bu, inkişaf zamanı vaxt işarələrinin düzgünlüyünü yoxlamağı asanlaşdırır.
Verilənlər bazasında vaxtın saxlanma formatının seçimi sorğuların performansına, kodun mürəkkəbliyinə və saat qurşaqları ilə işin düzgünlüyünə birbaşa təsir edir. Unix Timestamp — relyasiya verilənlər bazaları üçün ən səmərəli formatdır: tam ədəd kimi saxlanılır (4 və ya 8 bayt), indeksləmə və sürətli çeşid dəstəklənir. ISO 8601 sətrlərindən fərqli olaraq, timestamp çeşid zamanı parse tələb etmir və indeksdə daha az yer tutur. Room və SQLite üçün timestamp-i INTEGER tipində saxlamaq və vaxt sütununda indeks istifadə etmək tövsiyə olunur.
| Saxlama formatı | Ölçü | Çeşid | İndeksləmə |
|---|---|---|---|
| Unix Timestamp (INTEGER) | 4–8 bayt | Sürətli | Səmərəli |
| ISO 8601 (TEXT) | 20–30 bayt | Yavaş | Orta |
| DATETIME (SQLite) | 8 bayt | Orta | Orta |
Room kitabxanası ilə Android tətbiqləri üçün timestamp-i Long (64-bit) kimi saxlamaq və Long ilə Date və ya Instant arasında avtomatik konvertasiya üçün TypeConverter istifadə etmək tövsiyə olunur. Verilənlər bazasına sorğular zamanı müqayisə operatorlarından (>, <, BETWEEN) istifadə edin — onlar tam ədəd tipləri ilə yerli şəkildə işləyir. Vaxta görə çeşid tələb edən məlumatların keşlənməsi üçün (məsələn, mesaj siyahısı) mütləq timestamp sütununda indeks yaradın — bu, böyük həcmli məlumatlarda ORDER BY ilə sorğuları bir neçə dəfə sürətləndirəcək.
Tez-tez verilən suallar
Unix Timestamp — 1 yanvar 1970-ci il 00:00:00 UTC-dən saniyələrin sayıdır. Sadə sayıcı kimi işləyir: hər keçən gün 86 400 saniyə əlavə edir. Bu, saat qurşağına bağlı olmadan server və müştəri arasında asanlıqla müqayisə edilə, çeşidlənə və ötürülə bilən tam ədəddir.
java.time üçün Instant.ofEpochSecond(timestamp) (API 26+) və ya köhnə Android versiyaları üçün Date(timestamp * 1000) istifadə edin. Instant aldıqdan sonra onu LocalDate, ZonedDateTime-a çevirmək və ya DateTimeFormatter vasitəsilə formatlaşdırmaq olar. Əgər timestamp saniyələrlədirsə, 1000-ə vurmağı unutmayın.
19 yanvar 2038-ci il saat 03:14:07 UTC-də 32-bit signed int (2 147 483 647) dəyəri keçiləcək və daşma baş verəcək. 32-bit time_t olan sistemlər vaxtı mənfi ədəd kimi şərh etməyə başlayacaq. Həll yolu — müasir Android cihazlarında (API 21+) artıq istifadə olunan 64-bit time_t-a miqrasiyadır.
Saniyələr üçün System.currentTimeMillis() / 1000 və ya millisaniyələr üçün System.currentTimeMillis() çağırın. Şəbək sinxronizasiyası ilə daha dəqiq nəticə üçün Instant.now().epochSecond (API 26+ tələb olunur) və ya Android üçün NTP kitabxanalarından istifadə edin.
Unix Timestamp — 1970-01-01 UTC-dən saniyələrdir (integer). Java Timestamp millisaniyələrdən istifadə edir — eyni yerdəyişmə, lakin 1000 dəfə dəqiqdir. Konvertasiya üçün: millisaniyələr 1000-ə bölünür. JSON-API-lərdə daha çox saniyələr (Unix Timestamp), Android platformasında isə millisaniyələr (System.currentTimeMillis) istifadə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun