← Tous les articles

Convertir une date en Epoch en JavaScript, Python, SQL et Go

Tutoriel pour développeurs : convertir une date et un fuseau horaire en Unix epoch en JavaScript, Python, SQL, Go et shell. Couvre le parsing timezone-aware vs naïf, le gap DST et le choix secondes vs millisecondes.

Quand convertir une date en Epoch dans le code

La plupart des applis stockent les timestamps en entiers Unix, mais reçoivent les dates sous forme de chaînes — une valeur de calendrier dans un formulaire, une colonne de date dans un CSV, un champ webhook formaté dans un fuseau précis. Convertir ces chaînes en epoch dans le code, c'est ce qui permet aux bases de les trier, aux services de les comparer et aux APIs de les accepter. Ce guide montre la manière idiomatique de le faire en JavaScript, Python, SQL, Go et shell, ainsi que les bugs de fuseau horaire que toute équipe finit par rencontrer.

JavaScript : Date, getTime et entrées avec fuseau

JavaScript stocke le temps en millisecondes. Date.UTC renvoie l'epoch en ms pour une heure-mur UTC. Pour une chaîne ISO 8601 avec offset explicite, utilise new Date(iso).getTime(). Divise par 1000 pour des secondes.

  • Date.UTC(2026, 0, 1, 0, 0, 0) → 1767225600000 (month is zero-indexed)
  • new Date('2026-01-01T08:00:00-05:00').getTime() → 1767265200000
  • Math.floor(Date.now() / 1000) → current Unix seconds
  • Wall-clock in a non-UTC zone needs a zone-aware library (Luxon, date-fns-tz, Temporal)

Python : datetime.timestamp et calendar.timegm

L'objet datetime de Python se convertit en epoch via .timestamp(), mais uniquement s'il est timezone-aware. Un datetime naïf est interprété comme l'heure locale de l'hôte, ce qui est la cause la plus fréquente d'epoch faux en production.

  • datetime(2026, 1, 1, tzinfo=timezone.utc).timestamp() → 1767225600.0
  • calendar.timegm(struct_time) → seconds (UTC-only)
  • datetime.now(ZoneInfo('America/New_York')).timestamp() → zone-aware now
  • Avoid datetime.fromisoformat(s).timestamp() when s has no offset

SQL : EXTRACT EPOCH, UNIX_TIMESTAMP, UNIX_SECONDS

Toutes les grandes bases de données exposent une fonction pour matérialiser un entier epoch depuis une colonne timestamp. Traite explicitement le fuseau de la colonne : TIMESTAMP WITH TIME ZONE et TIMESTAMP WITHOUT TIME ZONE se comportent très différemment quand on les passe à ces fonctions.

  • PostgreSQL: EXTRACT(EPOCH FROM ts) → seconds (double)
  • MySQL: UNIX_TIMESTAMP(ts) → seconds, naive ts read in session timezone
  • BigQuery: UNIX_SECONDS(ts) / UNIX_MILLIS(ts) — TIMESTAMP only
  • SQLite: strftime('%s', ts) → seconds as string, cast to integer

Go et shell : time.Unix et date +%s

En Go, parse avec un layout qui contient l'offset, puis appelle .Unix() pour des secondes ou .UnixMilli() pour des millisecondes. En shell, GNU date -d interprète des chaînes de date courantes ; BSD/macOS date -j -f exige un format explicite.

  • Go: t, _ := time.Parse(time.RFC3339, "2026-01-01T00:00:00Z"); t.Unix()
  • Go: time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC).Unix()
  • GNU date: date -d "2026-01-01 00:00:00 UTC" +%s
  • macOS date: date -j -u -f "%Y-%m-%d %H:%M:%S" "2026-01-01 00:00:00" +%s

FAQ

How do I convert time to epoch time?
Choose the date, clock time, and timezone, then convert that instant to Unix seconds or milliseconds. If the timezone is missing, the result may be off by hours.
Is timestamp to epoch the same as date to epoch?
Usually yes. It means converting a readable timestamp or date-time string into an epoch number.
Should I send epoch seconds or milliseconds to an API?
Follow the API documentation. If it says Unix timestamp, it often means seconds, but JavaScript-oriented APIs may expect milliseconds.
Why does the same date give a different epoch in different timezones?
Because a local wall-clock time only identifies an instant once a timezone is attached. 2026-01-01 00:00 is 1767225600 in UTC but 1767243600 in New York — five hours later in real time. Set the timezone before converting.