Unix Timestamp — je celé číslo představující počet sekund, které uplynuly od 1. ledna 1970 00:00:00 UTC. Tento univerzální časový formát se používá v operačních systémech, databázích, API a mobilních aplikacích pro ukládání a přenos časových razítek bez vazby na časové pásmo. Podle Google Developers Blog (2025) zůstává Unix Timestamp nejoblíbenějším formátem pro serializaci času v REST API — používá jej 87% veřejných webových rozhraní.
Hlavní body
Unix Timestamp (také známý jako POSIX time, Epoch time nebo Unix time) — je systém měření času, který určuje počet sekund, které uplynuly od 1. ledna 1970 00:00:00 UTC (éra Unixu). Toto datum bylo vybráno jako začátek počítání pro operační systém Unix a následně se formát stal de facto standardem pro reprezentaci času v počítačových systémech. Timestamp nezohledňuje přestupné sekundy — každá minuta se počítá jako 60 sekund, i když Mezinárodní služba rotace Země občas přidává dodatečnou sekundu pro korekci atomového času.
Výběr 1. ledna 1970 souvisí s historií vývoje operačního systému Unix. Vývojáři Ken Thompson a Dennis Ritchie zvolili toto datum jako jednoduchý a kulatý počáteční bod — bylo dostatečně brzké na to, aby pokrylo všechna možná data, a zároveň dostatečně pozdní na to, aby čas mohl být uložen v 32-bitovém celém čísle se znaménkem. Původně se čas měřil v šedesátinách sekundy, poté v ticích (1/60 sekundy) a teprve v sedmém vydání Unixu (V7, 1979) se formát stabilizoval jako celý počet sekund. Podle The Open Group Base Specifications (Issue 8, 2024) jsou systémy kompatibilní s POSIX povinny tento formát podporovat.
Princip fungování Unix Timestamp je založen na jednoduchém počítadle: každý uplynulý den přidává k hodnotě 86 400 sekund. Například timestamp 1 720 000 000 odpovídá datu v polovině roku 2024 — přesný převod lze provést vydělením počtem sekund ve dni, hodině a minutě. Takový přístup činí timestamp ideálním pro strojové ukládání: je to celé číslo zabírající 4 bajty (32-bitový int) nebo 8 bajtů (64-bitový long) a podporuje přímé porovnání — větší timestamp = pozdější datum.
Jeden den = 86 400 sekund (24 x 60 x 60). Jedna hodina = 3600 sekund. Pro převod timestampu na datum je třeba postupně vypočítat počet dní, hodin, minut a sekund od začátku éry. Obrácený převod — převeďte datum na dny od 1970-01-01, poté vynásobte 86 400 a přidejte posun vůči UTC. V Javě a Kotlinu jsou tyto výpočty již implementovány ve standardních třídách java.time.Instant a java.util.Date, což zbavuje vývojáře ručních výpočtů.
// Získejte Unix Timestamp v sekundách
val seconds = System.currentTimeMillis() / 1000
// Převeďte timestamp na datum pomocí java.time
val instant = Instant.ofEpochSecond(seconds)
val localDate = instant.atZone(ZoneId.of("Europe/Moscow")).toLocalDate()
// Obráceně: datum na timestamp
val date = LocalDate.of(2026, 7, 21)
val ts = date.atStartOfDay(ZoneOffset.UTC).toEpochSecond()
Převod Unix Timestamp na čas čitelný pro člověka je jednou z nejčastějších operací v mobilním vývoji. V Androidu je k dispozici několik způsobů převodu v závislosti na minimální verzi API: pro API 26+ se doporučuje java.time.Instant, pro starší verze se používá java.util.Date a java.text.SimpleDateFormat. Je důležité si zapamatovat, že Android a JVM standardně používají milisekundy, nikoli sekundy — pokud byl timestamp přijat ze serveru v sekundách, je třeba jej vynásobit 1000 před předáním standardním konstruktorům.
Jednou z hlavních výhod Unix Timestamp je nezávislost na lokalitě. Server vždy vrací timestamp v UTC a převod na místní datum a čas se provádí na straně klienta. V Kotlinu se k tomu používá ZonedDateTime s příslušným ZoneId — systémovým nebo zvoleným uživatelem. Pokud aplikace zobrazuje čas v různých pásmech (například pro cestovatele), timestamp odstraňuje potřebu předávat časové pásmo ze serveru — stačí jedno časové razítko.
// Převod s časovým pásmem uživatele
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))
}
// Příklad: timestamp = 1720000000, pásmo = Europe/Moscow
val result = formatTimestamp(1720000000, ZoneId.of("Europe/Moscow"))
Problém roku 2038 (Year 2038 Problem, Y2K38) — je základní omezení 32-bitového celého čísla se znaménkem pro ukládání Unix Timestamp. Maximální hodnota 32-bitového signed int je 2 147 483 647, což odpovídá 19. lednu 2038 v 03:14:07 UTC. Po tomto datu hodnota přeteče a změní se na záporné číslo, což způsobí selhání v systémech používajících 32-bitový time_t. Problém je podobný známému Y2K, ale postihuje především vestavěné systémy, starší verze Androidu a IoT zařízení s 32-bitovou architekturou.
Podle Linux Foundation (2025) asi 15% zařízení s Linuxem v průmyslovém a IoT segmentu stále používá 32-bitové kompilace. Pro zařízení Android je riziko nižší — většina moderních chytrých telefonů běží na 64-bitových procesorech (ARM64), ale starší modely s Androidem 4.x a nižším mohou používat 32-bitový time_t. Řešením problému je migrace na 64-bitový time_t, který je bezpečný po dobu 292 miliard let. Počínaje Androidem 5.0 (API 21) všechna zařízení používají 64-bitový čas na úrovni jádra. Vývojářům mobilních aplikací stačí ukládat timestamp v typu Long (64-bitový), aby se problému vyhnuli na úrovni aplikace.
V Android vývoji je správná práce s Unix Timestamp kritická pro synchronizaci dat, zobrazení času přijetí zpráv, výpočet časových limitů a plánování oznámení. Systémové volání System.currentTimeMillis() vrací aktuální čas v milisekundách od éry Unixu — to je nejpřesnější zdroj času dostupný na zařízení. Pro síťové požadavky se obvykle používá Unix Timestamp v sekundách, protože většina REST API a databází pracuje právě se sekundami.
Nikdy nepoužívejte System.currentTimeMillis() pro měření intervalů — k tomu slouží System.nanoTime(), která je monotónní a nezávisí na změnách hodin uživatelem. Pro zobrazení času vždy ukládejte timestamp v UTC a převádějte jej do místního časového pásma na straně uživatelského rozhraní. Při práci s databázemi (SQLite, Room) používejte typ INTEGER a ukládejte timestamp v sekundách — to zabírá 8 bajtů (Long) a podporuje nativní SQL třídění. Pro serializaci v JSON se doporučuje odesílat timestamp jako číslo (Long), nikoli jako řetězec — je to kompaktnější a rychleji se parsuje.
// Správné měření doby provádění
val start = System.nanoTime()
// ... operace ...
val elapsed = System.nanoTime() - start
val seconds = elapsed / 1_000_000_000.0
// Uložte v Room (Entity)
@Entity
data class Message(
@PrimaryKey val id: Long,
val text: String,
val createdAt: Long // Unix Timestamp v sekundách
)
Při příjmu Unix Timestamp ze serveru vždy zkontrolujte jednotku měření: některá API vracejí milisekundy (kompatibilní s JavaScriptem), jiná sekundy (standard POSIX). Dohoda o jednotkách musí být zaznamenána v dokumentaci API. V odpovědi serveru může být timestamp předán jako Long (číslo JSON) nebo String (ISO 8601). Pro ladění přidejte pomocnou funkci, která zobrazuje timestamp v čitelném formátu — to zjednodušuje kontrolu správnosti časových razítek během vývoje.
Výběr formátu ukládání času v databázi přímo ovlivňuje výkon dotazů, složitost kódu a správnost práce s časovými pásmy. Unix Timestamp — nejúčinnější formát pro relační databáze: ukládá se jako celé číslo (4 nebo 8 bajtů), podporuje indexování a rychlé třídění. Na rozdíl od řetězců ISO 8601 timestamp nevyžaduje parsování při třídění a zabírá méně místa v indexu. Pro Room a SQLite se doporučuje ukládat timestamp v typu INTEGER a používat index na sloupci času.
| Formát ukládání | Velikost | Třídění | Indexování |
|---|---|---|---|
| Unix Timestamp (INTEGER) | 4–8 bajtů | Rychlé | Účinné |
| ISO 8601 (TEXT) | 20–30 bajtů | Pomalé | Střední |
| DATETIME (SQLite) | 8 bajtů | Střední | Střední |
Pro Android aplikace s knihovnou Room se doporučuje ukládat timestamp jako Long (64-bitový) a používat TypeConverter pro automatický převod mezi Long a Date nebo Instant. Při dotazech do databáze používejte porovnávací operátory (>, <, BETWEEN) — ty pracují nativně s číselnými typy. Pro ukládání do mezipaměti dat, která vyžadují třídění podle času (například seznam zpráv), vytvořte povinně index na sloupci timestamp — to urychlí dotazy s ORDER BY o několik řádů při velkém objemu dat.
Často kladené dotazy
Unix Timestamp — počet sekund od 1. ledna 1970 00:00:00 UTC. Funguje jako jednoduché počítadlo: každý uplynulý den přidává 86 400 sekund. Je to celé číslo, které lze snadno porovnávat, třídit a přenášet mezi serverem a klientem bez vazby na časové pásmo.
Použijte Instant.ofEpochSecond(timestamp) pro java.time (API 26+) nebo Date(timestamp * 1000) pro starší verze Androidu. Po získání Instant jej lze převést na LocalDate, ZonedDateTime nebo naformátovat pomocí DateTimeFormatter. Nezapomeňte vynásobit 1000, pokud je timestamp v sekundách.
19. ledna 2038 ve 03:14:07 UTC bude hodnota 32-bitového signed int (2 147 483 647) překročena, což způsobí přetečení. Systémy s 32-bitovým time_t začnou interpretovat čas jako záporné číslo. Řešením je migrace na 64-bitový time_t, který se již používá v moderních zařízeních Android (API 21+).
Zavolejte System.currentTimeMillis() / 1000 pro sekundy nebo System.currentTimeMillis() pro milisekundy. Pro přesnější výsledek se síťovou synchronizací použijte Instant.now().epochSecond (vyžaduje API 26+) nebo NTP klientské knihovny pro Android.
Unix Timestamp — sekundy od 1970-01-01 UTC (integer). Java Timestamp používá milisekundy — stejný posun, ale 1000krát přesnější. Pro převod: milisekundy se dělí 1000. V JSON-API se častěji používají sekundy (Unix Timestamp) a na platformě Android milisekundy (System.currentTimeMillis).
Závěr
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také