Date de création (created_at) : guide complet développeurs

La date de création — created_at — est la métadonnée qui horodate le tout premier instant d’existence d’une ressource : une ligne en base, un fichier, un enregistrement. Simple en apparence, elle conditionne l’audit, la conformité RGPD et le débogage de toute application. Voici comment la définir et l’implémenter proprement, langage par langage.

En bref
La date de création correspond à l’instant précis où une ressource a été générée pour la première fois. Elle doit être immuable, stockée en UTC, et distincte de la date de modification (updated_at).
  • Formats courants : ISO 8601 (2026-04-23T10:15:30Z) ou timestamp Unix (1777176930)
  • En base relationnelle, colonne NOT NULL avec valeur par défaut automatique
  • Tous les langages majeurs (SQL, JS, Python, PHP) et la plupart des ORM la génèrent nativement
  • Ne doit jamais être modifiable après écriture : c’est un invariant, pas un champ éditable

Qu’est-ce que la date de création ? #

La date de création (ou creation date, created_at) correspond à l’instant précis où une ressource a été générée pour la première fois dans un système.

Format ISO 8601
2026-04-23T10:15:30Z
Timestamp Unix
1777176930
Immuable
Ne doit jamais être modifiée après création
Distincte
De la date de modification (updated_at)

Pourquoi tracer la date de création #

Plusieurs cas d’usage justifient l’enregistrement systématique de cette information.

À lire User Creation Linux : Guide 2026 – Tutoriel

  • Audit — savoir qui a créé quoi et quand
  • Conformité RGPD — durée de conservation des données
  • Analytics — analyse de cohorte
  • Tri — ordre chronologique, flux, timelines
  • Débogage — corrélation temporelle des incidents

Implémenter created_at, langage par langage #

SQL : la colonne created_at

Dans une base relationnelle, la date de création est quasi-standard.

CREATE TABLE users (
  id INT PRIMARY KEY,
  email VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
SGBDDéclaration
MySQLTIMESTAMP DEFAULT CURRENT_TIMESTAMP
PostgreSQLTIMESTAMPTZ DEFAULT NOW()
SQL ServerDATETIME2 DEFAULT SYSDATETIME()
SQLiteDATETIME DEFAULT CURRENT_TIMESTAMP

Pour aller plus loin sur la création d’une structure de table complète, voir notre tutoriel sur la création d’une table MySQL.

JavaScript / Node.js

Plusieurs méthodes permettent de générer une date de création.

const createdAt = new Date().toISOString();
// "2026-04-23T10:15:30.123Z"
  • new Date() — objet Date natif
  • Date.now() — timestamp en millisecondes
  • toISOString() — format ISO 8601
  • dayjs / luxon — bibliothèques recommandées pour la manipulation de dates

Python

Le module datetime est la référence.

À lire Convertir un fichier MOV en AVI : Guide complet pour changer de format vidéo facilement

from datetime import datetime, timezone
created_at = datetime.now(timezone.utc).isoformat()
  • datetime.now() — heure locale
  • datetime.now(timezone.utc) — UTC recommandé
  • time.time() — timestamp float
  • pendulum — librairie moderne optionnelle

PHP

Le langage web dispose également d’outils natifs.

  • date(‘c’) — format ISO 8601
  • new DateTime() — objet DateTime
  • Carbon — librairie populaire héritée de Laravel
  • strtotime — parsing de chaînes

Les ORM et frameworks gèrent created_at automatiquement #

Les ORM gèrent la date de création sans code manuel, via une simple annotation ou un réglage.

FrameworkAnnotation / réglage
Laravel$timestamps = true
Symfony@Gedmo\Timestampable(on="create")
Railstimestamps dans schema.rb
DjangoDateTimeField(auto_now_add=True)
Hibernate@CreatedDate
Prisma@default(now())

Côté système : la date de création des fichiers #

Les systèmes d’exploitation stockent eux aussi une date de création pour chaque fichier.

Windows NTFS
Creation Time, visible via Propriétés
Linux ext4
btime, consultable via la commande stat
macOS APFS
Created Date, ls -lU
FAT32
Précision à la seconde près

Ces mécanismes système comptent parmi les premiers réflexes à connaître quand on administre soi-même ses serveurs — voir aussi notre guide sur la création d’un utilisateur sous Linux en ligne de commande.

À lire Création User Linux : Guide Complet Commandes

Fuseaux horaires et UTC #

Toujours stocker en UTC, afficher selon le fuseau de l’utilisateur.

  • Stockage — UTC uniquement en base
  • Affichage — conversion côté client ou serveur
  • Piège — heure d’été, DST, changements législatifs de fuseau
  • Librairies recommandées — luxon, date-fns-tz

Garantir l’immutabilité et l’intégrité #

La date de création doit être protégée contre toute modification ultérieure.

  • Trigger SQL — BEFORE UPDATE pour empêcher la modification
  • Hook ORM — champ en lecture seule après la persistance
  • Journal d’audit — tracer toute tentative de changement
  • Hash — intégrer created_at dans le hash d’intégrité

Bonnes pratiques pour vos colonnes created_at #

  • Colonne obligatoire — jamais NULL, toujours NOT NULL
  • Valeur par défaut — CURRENT_TIMESTAMP ou équivalent
  • Indexation — si le tri est fréquent, créez un index
  • Précision — au minimum la seconde, idéalement la microseconde
  • Rétention — définissez une politique d’archivage
À retenir
  • Immuable : une fois écrite, created_at ne doit plus jamais changer.
  • UTC en base, conversion au fuseau local uniquement à l’affichage.
  • NOT NULL + valeur par défaut automatique dès la création de la ligne.
  • Presque tous les ORM (Laravel, Django, Symfony, Rails, Prisma, Hibernate) la génèrent sans code manuel.
  • Distincte de updated_at : l’une raconte l’origine, l’autre l’évolution.

Pour aller plus loin #

created_at et updated_at : quelle différence ?
created_at ne change jamais après la première écriture : elle raconte l’origine de la ressource. updated_at est mise à jour à chaque modification et raconte son évolution.
Faut-il stocker created_at en UTC ou en heure locale ?
Toujours en UTC en base de données. La conversion vers le fuseau horaire de l’utilisateur se fait uniquement à l’affichage, côté client ou serveur, pour éviter les incohérences liées aux changements d’heure.
Peut-on modifier une date de création après coup ?
Non : c’est un invariant. Un trigger BEFORE UPDATE côté base ou un hook en lecture seule côté ORM permet de bloquer toute tentative de modification.
Quelle précision choisir pour created_at ?
La seconde est un minimum acceptable ; la microseconde est préférable dès que l’ordre exact d’événements rapprochés doit être garanti (logs, files d’attente, séquences d’audit).
Les ORM génèrent-ils created_at automatiquement ?
Oui, la plupart : Laravel via $timestamps, Django via auto_now_add=True, Symfony via l’extension Gedmo Timestampable, Rails via les timestamps du schéma, Prisma via @default(now()).
Les systèmes de fichiers ont-ils aussi une date de création ?
Oui : Windows NTFS l’expose via les Propriétés du fichier, macOS APFS via ls -lU, et Linux ext4 la stocke sous le nom de btime, consultable avec la commande stat.

La date de création est un élément fondamental de toute architecture logicielle propre. SQL, JavaScript, Python, PHP : tous les langages et frameworks disposent d’outils natifs pour la gérer. Stockez-la toujours en UTC, protégez son immutabilité, et laissez l’ORM automatiser sa génération. Cette rigueur paiera en audit, en débogage et en analyse pendant toute la durée de vie de vos applications.

ALJ Création est édité de façon indépendante. Soutenez la rédaction en nous ajoutant dans vos favoris sur Google Actualités :

Dans la même rubrique : Web & Freelance

A lire aussi : agence web 123web · développeur React freelance