JavaScript Date.now() : obtenir et convertir des timestamps Unix

Un guide centré sur JavaScript Date.now() : obtenez le timestamp Unix actuel, convertissez secondes contre millisecondes, transformez des timestamps en objets Date, formatez avec Intl et évitez les pièges de parsing courants.

Comment JavaScript stocke le temps en interne

Chaque Date JavaScript est en interne un seul float 64 bits représentant les millisecondes depuis l'epoch Unix (1er janvier 1970 00:00:00 UTC). Ce nombre est ce que renvoient Date.getTime() et Date.now(). Aucun fuseau n'est stocké dans un Date — c'est toujours un compte de millisecondes UTC. L'information de fuseau ne compte que lorsqu'on formate la date pour l'affichage, c'est pourquoi le même objet Date peut apparaître comme lundi soir à Los Angeles et mardi matin à Tokyo. Cet article se concentre sur Date.now() et la conversion de timestamps ; pour un parcours plus large de chaque tâche de timestamp en JavaScript, voir le guide de référence complet en lien ci-dessous.

Obtenir le timestamp Unix actuel

Utilisez Date.now() pour les millisecondes et Math.floor(Date.now() / 1000) pour les secondes. Les deux sont largement supportés et ne nécessitent aucun import. La bonne habitude de nommage est d'inclure l'unité dans le nom de variable : createdAtMs, expiresAtSeconds ou unixSeconds. Les noms avec unité empêchent un futur consommateur d'API de deviner ce que signifie un champ de timestamp nu.

  • Date.now() → 1700000000000 (milliseconds, 13 digits)
  • Math.floor(Date.now() / 1000) → 1700000000 (seconds, 10 digits)
  • +new Date() → same as Date.now() via unary coercion
  • new Date().getTime() → same result, slightly more verbose

Date.now() vs performance.now()

Date.now() sert aux timestamps d'horloge : logs, payloads d'API, champs de base, expiration de cache, et tout ce qui doit s'aligner sur le temps calendaire réel. performance.now() sert à mesurer la durée écoulée dans la page ou le processus courant. Il est monotone et de haute précision, mais ce n'est pas un timestamp Unix et il ne peut pas être converti en date réelle sans un point de référence supplémentaire.

  • Utilisez Date.now() quand la valeur sera stockée, envoyée à une API ou affichée comme date
  • Utilisez performance.now() pour mesurer combien de temps ont pris le rendu, le parsing ou une requête
  • Ne stockez pas performance.now() dans une base comme heure d'événement
  • Ne soustrayez pas deux valeurs de Date.now() pour une temporisation sensible à la sécurité ; les changements d'horloge système peuvent les affecter

Convertir un timestamp en Date

Le constructeur Date accepte des millisecondes. Si votre timestamp est en secondes (10 chiffres), multipliez par 1000 avant de le passer. L'oublier est l'erreur de timestamp la plus courante en JavaScript. Une vérification rapide est le nombre de chiffres : les secondes Unix actuelles ont 10 chiffres, les millisecondes Unix actuelles en ont 13, et un appel au constructeur Date doit recevoir la forme à 13 chiffres en millisecondes.

  • new Date(1700000000 * 1000) → Tue Nov 14 2023 22:13:20 UTC ✓ correct
  • new Date(1700000000) → Tue Jan 20 1970 16:13:20 UTC ✗ missing × 1000
  • new Date(1700000000 * 1000).toISOString() → '2023-11-14T22:13:20.000Z'
  • new Date(1700000000 * 1000).toUTCString() → 'Tue, 14 Nov 2023 22:13:20 GMT'

Formatage tenant compte du fuseau avec Intl

Utilisez Intl.DateTimeFormat pour une sortie tenant compte de la locale et du fuseau. Il gère l'heure d'été automatiquement et ne nécessite aucune bibliothèque externe. C'est la voie intégrée la plus sûre pour les tableaux de bord, les outils d'admin, les pages de statut et les timestamps côté utilisateur, car elle vous laisse choisir explicitement la locale et le fuseau IANA.

  • new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
  • date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
  • date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
  • new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) → array of {type, value} for custom layouts

Parser des chaînes de date en toute sécurité

Le parsing est là où JavaScript devient surprenant. Les chaînes ISO avec un Z ou un offset explicite sont sûres car elles identifient un instant exact. Les dates nues et les chaînes informelles sont plus faciles à lire, mais elles dépendent souvent des règles du navigateur ou du fuseau du runtime. Pour les contrats d'API, préférez des chaînes ISO 8601 avec fuseau ou des timestamps Unix numériques avec l'unité écrite dans le nom du champ.

  • Safe: new Date('2026-05-19T14:30:00Z') — explicit UTC
  • Safe: new Date('2026-05-19T10:30:00-04:00') — explicit offset
  • Risky: new Date('05/19/2026') — locale-dependent and ambiguous
  • Risky: new Date('2026-05-19 10:30') — not a strict ISO timestamp in all runtimes

Erreurs courantes de timestamp en JavaScript

  • new Date(1700000000) au lieu de new Date(1700000000 * 1000) — tombe en 1970, pas en 2023
  • getMonth() renvoie 0–11, pas 1–12 — utilisez toujours date.getMonth() + 1 à l'affichage
  • new Date('2024-01-01') se parse comme minuit UTC ; new Date('2024/01/01') comme minuit local
  • Ajouter 86400000 ms pour « demain » casse aux transitions d'heure d'été — utilisez setDate(d.getDate() + 1)
  • Comparer des objets Date avec === échoue toujours — comparez leurs valeurs .getTime()

Checklist recommandée des timestamps en JavaScript

Le modèle de production le plus simple est de stocker un seul instant canonique et de le formater seulement au bord. Gardez les timestamps en UTC, incluez les unités dans les noms et convertissez vers un fuseau lisible seulement dans l'UI ou la couche de reporting.

  • Utilisez les millisecondes Unix pour l'état navigateur seul et la construction de Date en JavaScript
  • Utilisez les secondes Unix en appelant des API qui documentent le temps Unix en secondes
  • Utilisez ISO 8601 avec Z ou un offset explicite quand des humains peuvent inspecter les payloads
  • Utilisez Intl.DateTimeFormat avec un timeZone explicite pour l'affichage
  • Ajoutez des tests autour des limites d'heure d'été quand les dates de calendrier locales comptent

FAQ sur les timestamps en JavaScript

Date.now() renvoie-t-il des secondes ou des millisecondes ?
Date.now() renvoie des millisecondes depuis le 1er janvier 1970 00:00:00 UTC. Divisez par 1000 et utilisez Math.floor() quand une API attend des secondes Unix.
Pourquoi new Date(1700000000) affiche-t-il 1970 ?
Le constructeur Date attend des millisecondes. 1700000000 est un timestamp en secondes, donc JavaScript le lit comme seulement 1,7 milliard de millisecondes après l'epoch. Utilisez new Date(1700000000 * 1000).
Un Date JavaScript stocke-t-il un fuseau ?
Non. Un Date stocke un compte de millisecondes UTC. Le fuseau n'est appliqué qu'au formatage avec des méthodes comme toString(), toLocaleString() ou Intl.DateTimeFormat.
Comment convertir un timestamp Unix en Date JavaScript ?
Passez des millisecondes au constructeur : new Date(seconds * 1000) pour une valeur de secondes à 10 chiffres, ou new Date(ms) pour une valeur de millisecondes à 13 chiffres. Oublier le × 1000 est pourquoi un timestamp de 2023 peut s'afficher comme 1970.