Unix Timestamp: cos'è, conversione e archiviazione nello sviluppo mobile

Autore: IT Sectr Pubblicato: 2026-07-14 Tempo di lettura: 9 min

Unix Timestamp è un numero intero che rappresenta la quantità di secondi trascorsi dal 1 gennaio 1970 00:00:00 UTC. Questo formato orario universale viene utilizzato in sistemi operativi, database, API e applicazioni mobili per archiviare e trasmettere marcatori temporali senza dipendere dal fuso orario. Secondo Google Developers Blog (2025), Unix Timestamp rimane il formato più popolare per la serializzazione del tempo nelle REST API — l'87% delle interfacce web pubbliche lo utilizza.

Punti chiave

  • Unix Timestamp — il numero di secondi dal 1 gennaio 1970 UTC, un numero intero non negativo
  • Universalità — il formato non dipende dal fuso orario, semplificando lo scambio di dati tra server e client
  • Problema del 2038 — per i sistemi a 32 bit, il valore del timestamp supererà 2^31, causando overflow
  • Millisecondi — in Android e Java si usa più spesso Java Timestamp in millisecondi (Unix Timestamp x 1000)
  • Archiviazione — il timestamp è più compatto delle stringhe ISO e più efficiente per ordinamento e confronto nei database

Cos'è Unix Timestamp?

Unix Timestamp (noto anche come POSIX time, Epoch time o Unix time) è un sistema di misurazione del tempo che definisce il numero di secondi trascorsi dal 1 gennaio 1970 00:00:00 UTC (l'epoca Unix). Questa data fu scelta come punto di partenza per il sistema operativo Unix, e successivamente il formato divenne lo standard de facto per rappresentare il tempo nei sistemi informatici. Il timestamp non tiene conto dei secondi intercalari — ogni minuto viene conteggiato come 60 secondi, sebbene il Servizio Internazionale di Rotazione Terrestre aggiunga talvolta un secondo supplementare per correggere il tempo atomico.

L'epoca Unix: perché il 1970?

La scelta del 1 gennaio 1970 è legata alla storia del sistema operativo Unix. Gli sviluppatori Ken Thompson e Dennis Ritchie selezionarono questa data come un semplice punto di partenza rotondo — era abbastanza precoce da coprire tutte le date possibili, e abbastanza tardiva da permettere che il tempo fosse archiviato in un intero con segno a 32 bit. Inizialmente, il tempo veniva misurato in sessantesimi di secondo, poi in tick (1/60 di secondo), e solo nella Settima Edizione di Unix (V7, 1979) il formato si stabilizzò come numero intero di secondi. Secondo The Open Group Base Specifications (Issue 8, 2024), i sistemi compatibili POSIX sono obbligati a supportare questo formato.

Come funziona Unix Timestamp

Il principio di funzionamento di Unix Timestamp si basa su un semplice contatore: ogni giorno che passa aggiunge 86.400 secondi al valore. Ad esempio, il timestamp 1.720.000.000 corrisponde a una data a metà del 2024 — la conversione esatta può essere effettuata dividendo per il numero di secondi in un giorno, un'ora e un minuto. Questo approccio rende il timestamp ideale per l'archiviazione macchina: è un numero intero che occupa 4 byte (int a 32 bit) o 8 byte (long a 64 bit) e supporta il confronto diretto — un timestamp maggiore = una data più tardiva.

Matematica di conversione

Un giorno = 86.400 secondi (24 x 60 x 60). Un'ora = 3.600 secondi. Per convertire un timestamp in una data, è necessario calcolare sequenzialmente il numero di giorni, ore, minuti e secondi dall'epoca. La conversione inversa — convertire una data in giorni dal 1970-01-01, poi moltiplicare per 86.400 e aggiungere l'offset UTC. In Java e Kotlin, questi calcoli sono già implementati nelle classi standard java.time.Instant e java.util.Date, che sollevano lo sviluppatore dai calcoli manuali.

kotlin
        // Ottenere Unix Timestamp in secondi
val seconds = System.currentTimeMillis() / 1000

// Convertire timestamp in data tramite java.time
val instant = Instant.ofEpochSecond(seconds)
val localDate = instant.atZone(ZoneId.of("Europe/Moscow")).toLocalDate()

// Inverso: data in timestamp
val date = LocalDate.of(2026, 7, 21)
val ts = date.atStartOfDay(ZoneOffset.UTC).toEpochSecond()

Conversione di Unix Timestamp in data e viceversa

La conversione di Unix Timestamp in una data leggibile dall'uomo è una delle operazioni più comuni nello sviluppo mobile. Su Android, sono disponibili diversi metodi di conversione a seconda della versione minima dell'API: per API 26+ si consiglia di usare java.time.Instant, per le versioni precedenti si usano java.util.Date e java.text.SimpleDateFormat. È importante ricordare che Android e la JVM utilizzano millisecondi per impostazione predefinita, non secondi — se un timestamp viene ricevuto dal server in secondi, deve essere moltiplicato per 1000 prima di essere passato ai costruttori standard.

Conversione con fuso orario

Uno dei principali vantaggi di Unix Timestamp è l'indipendenza dalla posizione. Il server restituisce sempre il timestamp in UTC, e la conversione in data e ora locale viene eseguita sul lato client. In Kotlin, si utilizza ZonedDateTime con il ZoneId appropriato — quello di sistema o quello selezionato dall'utente. Se un'applicazione mostra l'ora in diversi fusi orari (ad esempio, per i viaggiatori), il timestamp elimina la necessità di trasmettere il fuso orario dal server — un singolo marcatore temporale è sufficiente.

kotlin
// Convertire con fuso orario dell'utente
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))
}

// Esempio: timestamp = 1720000000, zone = Europe/Moscow
val result = formatTimestamp(1720000000, ZoneId.of("Europe/Moscow"))

Il problema dell'anno 2038

Il problema dell'anno 2038 (Y2K38) è una limitazione fondamentale dell'archiviazione di Unix Timestamp come intero con segno a 32 bit. Il valore massimo di un int con segno a 32 bit è 2.147.483.647, che corrisponde al 19 gennaio 2038 alle 03:14:07 UTC. Dopo questa data, il valore va in overflow e diventa un numero negativo, causando guasti nei sistemi che utilizzano time_t a 32 bit. Il problema è simile al noto Y2K, ma colpisce principalmente i sistemi embedded, le versioni precedenti di Android e i dispositivi IoT con architettura a 32 bit.

Scala del problema

Secondo la Linux Foundation (2025), circa il 15% dei dispositivi Linux nei segmenti industriale e IoT utilizza ancora build a 32 bit. Per i dispositivi Android, il rischio è inferiore — la maggior parte degli smartphone moderni funziona su processori a 64 bit (ARM64), ma i modelli più vecchi con Android 4.x e precedenti potrebbero utilizzare time_t a 32 bit. La soluzione è la migrazione a time_t a 64 bit, che è sicuro fino a 292 miliardi di anni. A partire da Android 5.0 (API 21), tutti i dispositivi utilizzano tempo a 64 bit a livello di kernel. Gli sviluppatori di applicazioni mobili devono solo archiviare il timestamp come Long (64 bit) per evitare il problema a livello di applicazione.

Lavorare con Unix Timestamp in Android

Nello sviluppo Android, la corretta gestione di Unix Timestamp è fondamentale per la sincronizzazione dei dati, la visualizzazione degli orari di ricezione dei messaggi, il calcolo dei timeout e la pianificazione delle notifiche. La chiamata di sistema System.currentTimeMillis() restituisce l'ora corrente in millisecondi dall'epoca Unix — questa è la fonte temporale più accurata disponibile sul dispositivo. Per le richieste di rete, si utilizza generalmente Unix Timestamp in secondi, poiché la maggior parte delle REST API e dei database opera in secondi.

Pratiche consigliate

Non usare mai System.currentTimeMillis() per misurare intervalli — per questo scopo esiste System.nanoTime(), che è monotona e non viene influenzata dalle modifiche dell'orologio da parte dell'utente. Per la visualizzazione dell'ora, archiviare sempre il timestamp in UTC e convertirlo nel fuso orario locale sul lato dell'interfaccia utente. Quando si lavora con database (SQLite, Room), utilizzare il tipo INTEGER e archiviare il timestamp in secondi — questo occupa 8 byte (Long) e supporta l'ordinamento SQL nativo. Per la serializzazione JSON, si consiglia di inviare il timestamp come numero (Long) anziché come stringa — è più compatto e viene analizzato più velocemente.

kotlin
// Misurazione corretta del tempo di esecuzione
val start = System.nanoTime()
// ... operazione ...
val elapsed = System.nanoTime() - start
val seconds = elapsed / 1_000_000_000.0

// Archiviare in Room (Entity)
@Entity
data class Message(
    @PrimaryKey val id: Long,
    val text: String,
    val createdAt: Long // Unix Timestamp in secondi
)

Gestione del tempo del server

Quando si riceve un Unix Timestamp dal server, controllare sempre l'unità di misura: alcune API restituiscono millisecondi (compatibili con JavaScript), altre restituiscono secondi (standard POSIX). L'accordo sulle unità deve essere documentato nelle specifiche dell'API. Nella risposta del server, il timestamp può essere passato come Long (numero JSON) o String (ISO 8601). Per il debug, aggiungere una funzione di utilità che visualizzi il timestamp in un formato leggibile dall'uomo — questo semplifica la verifica dei marcatori temporali durante lo sviluppo.

Archiviazione dei marcatori temporali nei database

La scelta del formato di archiviazione del tempo in un database influisce direttamente sulle prestazioni delle query, sulla complessità del codice e sulla correttezza della gestione dei fusi orari. Unix Timestamp è il formato più efficiente per i database relazionali: viene archiviato come numero intero (4 o 8 byte), supporta l'indicizzazione e consente un ordinamento rapido. A differenza delle stringhe ISO 8601, il timestamp non richiede analisi per l'ordinamento e occupa meno spazio in un indice. Per Room e SQLite, si consiglia di archiviare il timestamp come INTEGER e di utilizzare un indice sulla colonna del tempo.

Formato di archiviazioneDimensioneOrdinamentoIndicizzazione
Unix Timestamp (INTEGER)4–8 byteVeloceEfficiente
ISO 8601 (TEXT)20–30 byteLentoMedia
DATETIME (SQLite)8 byteMediaMedia

Raccomandazioni per progetti mobili

Per le applicazioni Android che utilizzano la libreria Room, si consiglia di archiviare i timestamp come Long (64 bit) e di utilizzare un TypeConverter per la conversione automatica tra Long e Date o Instant. Quando si eseguono query sul database, utilizzare operatori di confronto (>, <, BETWEEN) — funzionano nativamente con i tipi interi. Per la memorizzazione nella cache di dati che richiedono un ordinamento temporale (ad esempio, un elenco di messaggi), creare sempre un indice sulla colonna del timestamp — questo accelererà le query con ORDER BY di diversi ordini di grandezza con volumi di dati elevati.

Domande frequenti

Cos'è Unix Timestamp e come funziona?

Unix Timestamp è il numero di secondi dal 1 gennaio 1970 00:00:00 UTC. Funziona come un semplice contatore: ogni giorno che passa aggiunge 86.400 secondi. È un numero intero che può essere facilmente confrontato, ordinato e trasferito tra server e client senza dipendere dal fuso orario.

Come convertire Unix Timestamp in data in Kotlin?

Utilizzare Instant.ofEpochSecond(timestamp) per java.time (API 26+) o Date(timestamp * 1000) per le versioni precedenti di Android. Dopo aver ottenuto l'Instant, può essere convertito in LocalDate, ZonedDateTime o formattato tramite DateTimeFormatter. Non dimenticare di moltiplicare per 1000 se il timestamp è in secondi.

Qual è l'essenza del problema dell'anno 2038?

Il 19 gennaio 2038 alle 03:14:07 UTC, il valore di un int con segno a 32 bit (2.147.483.647) verrà superato, causando overflow. I sistemi con time_t a 32 bit inizieranno a interpretare il tempo come un numero negativo. La soluzione è la migrazione a time_t a 64 bit, già utilizzato nei dispositivi Android moderni (API 21+).

Come ottenere l'Unix Timestamp corrente in Android?

Chiamare System.currentTimeMillis() / 1000 per i secondi o System.currentTimeMillis() per i millisecondi. Per un risultato più preciso che tenga conto della sincronizzazione di rete, utilizzare Instant.now().epochSecond (richiede API 26+) o librerie client NTP per Android.

Qual è la differenza tra Unix Timestamp e millisecondi?

Unix Timestamp sono secondi dal 1970-01-01 UTC (intero). Java Timestamp utilizza i millisecondi — lo stesso offset ma 1000 volte più preciso. Per la conversione: millisecondi divisi per 1000. Le API JSON usano più spesso secondi (Unix Timestamp), mentre la piattaforma Android usa millisecondi (System.currentTimeMillis).

Riepilogo

  • Unix Timestamp — un formato orario intero universale basato sul numero di secondi dal 1 gennaio 1970 UTC
  • Indipendenza dai fusi orari — il timestamp è sempre in UTC, la conversione in ora locale viene eseguita sul lato client, eliminando una classe di errori legati ai fusi orari
  • Conversione — in Android, utilizzare Instant.ofEpochSecond (API 26+) o Date con moltiplicazione per 1000 per le versioni precedenti della piattaforma
  • Problema del 2038 — una limitazione del time_t a 32 bit; la soluzione è l'archiviazione in Long a 64 bit e l'uso di versioni moderne di Android (API 21+)
  • Archiviazione in DB — il timestamp come INTEGER in SQLite/Room è più efficiente delle stringhe ISO 8601 in termini di dimensione, velocità di ordinamento e indicizzazione
  • Per la misurazione del tempo — utilizzare System.nanoTime() per gli intervalli, System.currentTimeMillis() per i marcatori temporali (considerando le regolazioni dell'utente)
  • Accordo con il server — chiarire sempre le unità di misura (secondi o millisecondi) nella documentazione dell'API per evitare errori di conversione

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche