Què és un timestamp Unix (i per què els desenvolupadors el fan servir)?

Un timestamp Unix és un únic enter: el nombre de segons que han transcorregut des de l’1 de gener de 1970, a les 00:00:00 UTC. Aquest moment s’anomena l’època Unix (Unix epoch), i cada segon des d’aleshores s’ha comptat sense interrupció.

El timestamp actual ara mateix és d’aproximadament 1,750,000,000. Només aquest número ja indica a qualsevol ordinador, base de dades o API quin moment exacte en el temps vols dir — sense ambigüitats.

Per què 1970?

Unix es va desenvolupar a finals dels anys 60 als Bell Labs. Quan els enginyers van necessitar un punt de referència fix per al temps, van triar l’1 de gener de 1970 — l’inici d’una nova dècada, fàcil d’entendre, i convenientment en el passat recent perquè les dates emmagatzemades no requerissin números negatius per a res pràctic en aquell moment.

Va ser una decisió pragmàtica, no basada en un principi. I es va quedar.

El problema que resolen els timestamps Unix

Representar dates com a cadenes llegibles per humans crea ambigüitat a cada capa:

  • Desacords de format: 03/04/25 és 4 de març o 3 d’abril? És 1925 o 2025?
  • Confusió de zones horàries: “divendres a les 3 de la tarda” vol dir un moment diferent a Londres que a Tòquio
  • Diferències de locale: alguns països escriuen dia-mes-any, d’altres mes-dia-any

Un timestamp Unix evita tot això. 1711929600 és un únic moment inequívoc en el temps independentment d’on siguis o del format que prefereixis. Les màquines s’hi posen d’acord; els humans poden convertir-ho.

Segons, mil·lisegons i microsegons

El timestamp Unix original és en segons. Però diferents sistemes utilitzen diferents resolucions:

FormatUnitatExemple
Unix (POSIX)Segons1711929600
JavaScript Date.now()Mil·lisegons1711929600000
Python time.time()Segons (float)1711929600.123
Timestamps de base de dadesSovint microsegons1711929600000000

Això és una de les fonts de bugs més comunes quan treballes entre sistemes. Un timestamp de JavaScript passat directament a una funció de Python o Go serà 1,000× massa gran. Comprova sempre la resolució quan travessis límits entre sistemes.

Llegir i escriure timestamps Unix

A JavaScript / TypeScript

// Timestamp actual en segons
Math.floor(Date.now() / 1000)

// Timestamp actual en mil·lisegons
Date.now()

// Convertir timestamp (segons) a objecte Date
new Date(timestamp * 1000)

// Convertir Date a timestamp (segons)
Math.floor(new Date('2024-04-01').getTime() / 1000)

A Python

import time, datetime

# Timestamp actual (float)
time.time()

# Convertir a datetime
datetime.datetime.fromtimestamp(1711929600)

# Convertir datetime a timestamp
datetime.datetime(2024, 4, 1).timestamp()

A SQL (PostgreSQL)

-- Timestamp actual
EXTRACT(EPOCH FROM NOW())::int

-- Convertir a timestamp
TO_TIMESTAMP(1711929600)

Les zones horàries no afecten el timestamp en si

Això és important i sovint es malentén.

Un timestamp Unix sempre representa un moment en UTC. Quan el mostres, el converteixes a una zona horària local. Quan l’emmagatzemes, emmagatzemes el valor UTC. El timestamp en si és neutre respecte a la zona horària.

Això vol dir:

  • Dos usuaris en zones horàries diferents que emmagatzemen “ara” obtindran el mateix timestamp
  • En mostrar-lo, cada usuari el veu en la seva hora local
  • No cal ajustar offsets a la base de dades — només a la capa de presentació

El problema de l’any 2038

Els timestamps Unix emmagatzemats com a enter amb signe de 32 bits només poden comptar fins a 2,147,483,647 segons — que correspon a 19 de gener de 2038, a les 03:14:07 UTC. Després d’això, un comptador de 32 bits es desborda i passa a un gran número negatiu.

Els sistemes que encara emmagatzemen timestamps com a enters de 32 bits fallaran en aquella data. La majoria de sistemes moderns utilitzen enters de 64 bits, que desplacen la data de desbordament fins a l’any 292 mil milions — un límit irrellevant per a usos pràctics.

Si treballes amb sistemes encastats, bases de dades antigues o codi C vell, val la pena comprovar com s’emmagatzemen els timestamps.

Quan fer servir un timestamp Unix

Fes servir un timestamp Unix quan:

  • Emmagatzemis dates en una base de dades i vulguis un enter simple i ordenable
  • Passis dates entre sistemes o APIs
  • Comparis o ordenis esdeveniments cronològicament
  • Calculis durades (només cal restar dos timestamps)
  • Treballis amb memòries cau o lògiques de caducitat (expires_at = now + 3600)

Fes servir una cadena de data amb format quan:

  • Mostris una data a un usuari
  • Registris esdeveniments llegibles per humans
  • Treballis en fulls de càlcul o exportacions CSV

Conversions ràpides

QuèSegons
1 minut60
1 hora3,600
1 dia86,400
1 setmana604,800
30 dies2,592,000
1 any (aprox.)31,536,000

El Unix Timestamp Converter converteix qualsevol timestamp a una data llegible per humans o converteix una data a timestamp Unix a l’instant.

Articles relacionats