La différence de date dans Excel est de quatre ans : regardez d'abord le système de date du classeur

iso_dates contrôle la méthode de sérialisation de la date dans le fichier et ne transforme pas automatiquement la date/heure en mémoire en chaîne. Le numéro de série de date nécessite l’époque du classeur ; ici, nous comparons les deux systèmes de date et vérifions les valeurs XML et de relecture enregistrées.

Excel exporte des dates décalées de quatre ans et, dans la plupart des cas, le problème vient du système de date du classeur, et non des données elles-mêmes. Écrit pour les développeurs et les personnes responsables des exportations de rapports, des scripts ETL ou de l'échange multiplateforme de fichiers Excel. Lorsque vous rencontrez des situations telles qu'un décalage de date global, des nombres qui ne peuvent pas être affichés sous forme de dates, des anomalies de données autour de 1900, etc., vous pouvez d'abord résoudre les problèmes dans l'ordre de cet article.

Après avoir lu cet article, vous comprendrez la différence entre les deux systèmes de date de 1900 et 1904, saurez comment lire workbook.epoch pour confirmer le système utilisé par le classeur actuel et maîtriserez la méthode d'acceptation de vérification XML et de relecture des valeurs après sauvegarde. Le code et les tableaux de cet article sont illustrés d'exemples synthétiques, pouvant servir de liste de contrôle avant de travailler avec des documents réels.

Que dois-je faire si la date Excel est différente de quatre ans ? Conclusion en une phrase

Lisez d'abord le workbook.epoch du classeur et confirmez le système de date avant la conversion ; les problèmes de date limite et de fuseau horaire sont traités séparément.

votre situationPratiques recommandéesraison
La date exportée est globalement décalée d'environ 1462 joursLisez d'abord workbook.epoch pour confirmer le système de date du classeurLa différence entre les systèmes 1900 et 1904 est de 1462 jours, et des hypothèses incorrectes du côté lecture entraîneront une mauvaise interprétation de tous les numéros de série.
La cellule est un nombre mais ne peut pas être affichée sous forme de dateVérifier et compléter le masque de format de date number_formatLorsque le type numérique est correct, les formats manquants entraîneront des anomalies d'affichage.
Les dates antérieures à mars 1900 ou 1900-02-29 apparaissent dans les donnéesMarquer comme invalide ou transféré vers une révision manuelle, conserver le numéro de série d'origineCette date n'existe pas dans le calendrier grégorien et ne doit pas être forcée à se convertir
datetime avec fuseau horaire doit être écritSupprimer tzinfo après une conversion unifiée en UTCExcel ne prend pas en charge le stockage des fuseaux horaires, toutes les heures sont l'heure locale sans que l'on s'en rende compte
Les fichiers doivent être échangés entre les plates-formesDéclarer explicitement le système de dateLes paramètres par défaut du récepteur sont différents, ce qui peut produire un décalage silencieux

Différences entre les systèmes de date de 1900 et 1904

Une date dans un fichier XLSX est essentiellement un numéro de série à virgule flottante et sa signification dépend entièrement du système de date auquel le classeur est lié. La spécification XLSX autorise deux époques de base :

  • 1900 Date System : utilisé par Windows par défaut, le numéro de série 1 représente le 1900-01-01
  • Système de date 1904 : utilisé par défaut sur les premiers Mac, le numéro de série 0 représente le 01/01/1904

Il existe un décalage fixe de 1 462 jours entre les deux, qui est la principale source de la « différence de date de quatre ans ». De plus, le système 1900 a un problème historique : il traite incorrectement 1900 comme une année bissextile, ce qui entraîne la légalisation de la date inexistante du 29/02/1900 dans Excel.

Comparaison de base

projetSystème de date 1900Système de date 1904
Point de départ du numéro de sérieLe numéro de série 1 correspond au 1900-01-01Le numéro de série 0 correspond au 1904-01-01
Sources par défaut courantesWindowsPremier Mac
décalage par rapport à un autre système1462 jours de différence1462 jours de différence
numéros spéciaux1900 confondu avec une année bissextile, existe le 29/02/1900Cet article ne couvre pas ces problèmes

Pourquoi les données antérieures à 1900 nécessitent une attention particulière

Si vous traitez des données historiques antérieures à mars 1900, le module datetime de Python ne peut pas représenter directement le 29 février. Selon la documentation officielle d'openpyxl, afin d'être compatible avec le comportement d'Excel, la bibliothèque simulera cette exception lors de la lecture des dates de janvier et février sous le système 1900, mais le 1900-02-29 lui-même ne peut pas être converti en un objet Python datetime valide.

Pour la plupart des données commerciales modernes, la clé est d'identifier le système utilisé par le classeur actuel et de le déclarer explicitement lors de l'échange de fichiers entre plates-formes afin d'éviter une dérive silencieuse du côté récepteur en raison de différents paramètres par défaut.

Exemple de synthèse : méthodes de saisie et de traitement des limites

Pour illustrer le problème, nous construisons un scénario synthétique : un rapport exporté par un système financier utilise le système de date 1904, mais le script ETL en aval l'analyse selon le système 1900 par défaut.

Gestion des erreurs ou des entrées de limites :

  1. Si le numéro de série saisi est 60 et que le classeur est destiné au système 1900, il correspond au 1900-02-29 fictif dans Excel. Le datetime natif de Python lance ValueError.
  2. À ce stade, l'exception ne doit pas être forcée, mais l'exception doit être détectée et enregistrée comme valeur originale ou marque spéciale, car la date n'existe pas dans le calendrier grégorien.
  3. Si un objet datetime avec des informations de fuseau horaire est transmis pour écriture, openpyxl ne convertira pas automatiquement le fuseau horaire, mais nécessite que tzinfo soit d'abord supprimé, sinon une erreur d'écriture ou une erreur pourrait se produire.
  4. Excel lui-même ne prend pas en charge le stockage des fuseaux horaires et toutes les heures sont l'heure locale sans que l'on en soit conscient.

Détection du système de date et code de conversion sécurisé

L'exemple suivant montre comment gérer en toute sécurité les différences de système de date en mémoire. Le code est uniquement destiné à une démonstration logique et n’effectue pas de lecture et d’écriture réelles de fichiers. Il doit être exécuté dans votre propre environnement de dépendances verrouillé. Openpyxl >= 3.1.0 est recommandé. Les exemples n'incluent pas les requêtes réseau ni les opérations d'écrasement de fichiers, toutes les assertions sont basées sur des données synthétiques.

from datetime import datetime
from io import BytesIO
from zipfile import ZipFile
from openpyxl import Workbook, load_workbook
from openpyxl.utils.datetime import from_excel, CALENDAR_MAC_1904, CALENDAR_WINDOWS_1900
assert from_excel(1, CALENDAR_MAC_1904) == datetime(1904, 1, 2)
assert from_excel(1, CALENDAR_WINDOWS_1900) == datetime(1900, 1, 1)
wb = Workbook()
wb.epoch = CALENDAR_MAC_1904
wb.iso_dates = True
value = datetime(2026, 9, 26, 12, 30)
wb.active["A1"] = value
assert wb.active["A1"].value == value
out = BytesIO()
wb.save(out)
with ZipFile(BytesIO(out.getvalue())) as z:
    xml = z.read("xl/worksheets/sheet1.xml")
    assert b't="d"' in xml and b"2026-09-26T12:30:00" in xml
restored = load_workbook(BytesIO(out.getvalue()))
assert restored.active["A1"].value == value
assert restored.epoch == CALENDAR_MAC_1904

Critères d'acceptation et limites de révision manuelle

Observer les phénomènesconditions d'entrée ou aux limitesrésultat attendu ou décision de traitementSi l'automatisation est applicable
Toutes les dates sont décalées uniformément de 1462 jourswb.epoch n'est pas cohérent avec les hypothèses analytiquesLisez wb.epoch et reconvertissez le numéro de séquenceOui
1900-02-29 apparaît dans les donnéesSystème 1900 avec numéro de série 60Marqué comme date invalide, conserver le numéro de série d'origine 60Non, vous devez confirmer manuellement la signification commerciale
Une partie du temps est manquante ou égaréeEntrez datetime avec tzinfoConvertissez uniformément en UTC, puis supprimez tzinfo pour l'écriturepartie, vous devez définir manuellement le fuseau horaire cible
La cellule affiche un numéro mais formatée en dateLe type numérique est correct mais number_format est manquantVérifier et compléter le masque de format de dateOui
Les dates historiques (antérieures au 01/01/1900) s'affichent anormalementDate antérieure au 01/01/1900Utilisez plutôt le stockage de texte ou une base de données d'historique dédiéeNon, XLSX n'est pas adapté à ce scénario

Il convient de noter que la démonstration du code vérifie uniquement l'exactitude de la logique de conversion et n'égale pas l'effet de bout en bout. Les fichiers réels peuvent contenir plusieurs formats de date, formats conditionnels ou dates générées par des formules, qui nécessitent des couches d'analyse supplémentaires. Lorsque vous rencontrez des dates antérieures à mars 1900, des données de collaboration entre fuseaux horaires ou des calendriers non standard (tels que le calendrier lunaire, l'année fiscale), vous devez entrer dans un processus de révision manuelle et les scripts automatisés ne doivent pas effectuer de corrections non autorisées.

🎯 Quelle méthode vous convient ?

Si vous avez besoin de lire la date du fichier d'exportation

Lisez d'abord workbook.epoch, confirmez le système de date, puis décidez s'il faut reconvertir le numéro de série.

Si vos données concernent des dates antérieures à mars 1900

Marquez les enregistrements liés au 1900-02-29 comme invalides, conservez le numéro de série d'origine et remettez-le pour confirmation manuelle de la signification commerciale.

Si vous devez écrire l'heure avec le fuseau horaire dans Excel

Convertissez d'abord uniformément en UTC, puis supprimez tzinfo ; le fuseau horaire cible doit être défini manuellement.

Si vous souhaitez échanger des fichiers avec d'autres systèmes

Déclarez explicitement le système de date et validez les valeurs de date de relecture du côté récepteur.

❓ Questions fréquemment posées (FAQ)

1. Pourquoi la date d'exportation est-elle décalée d'environ quatre ans ?

Une cause fréquente est que le système de date du classeur n'est pas cohérent avec les hypothèses relatives à la lecture. La différence entre les deux systèmes de 1900 et 1904 est de 1 462 jours.

2. iso_dates transformera-t-il automatiquement datetime en chaîne ?

Ne le fera pas. iso_dates contrôle uniquement la méthode de sérialisation de la date dans le fichier et ne convertit pas automatiquement datetime dans la mémoire en chaîne.

3. Pourquoi 1900-02-29 ne peut-il pas être converti en datetime Python ?

1900 Le système traite à tort 1900 comme une année bissextile, ce qui entraîne l'existence du 29/02/1900 dans Excel, mais le jour n'existe pas dans le calendrier grégorien. datetime de Python lance ValueError, auquel cas la valeur numérique d'origine ou l'indicateur spécial doit être enregistré.

4. Comment écrire une date/heure avec un fuseau horaire dans Excel ?

Excel ne prend pas en charge le stockage des fuseaux horaires. Il doit d'abord être uniformément converti en UTC, puis supprimé de tzinfo avant d'être écrit ; openpyxl ne terminera pas automatiquement la conversion du fuseau horaire.

📝Résumé

Les problèmes de décalage de date proviennent généralement du système de date du classeur. Confirmer workbook.epoch avant la conversion peut éviter la plupart des erreurs silencieuses. Les problèmes de date limite et de fuseau horaire doivent être soumis à un examen humain.

Essayez-le maintenant : téléchargez le document pour lancer la traduction, en conservant la mise en page d'origine.

Références et prochaines étapes

  • documentation officielle de date et d'heure d'openpyxl : https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Note de Microsoft sur le système de date 1900/1904 : https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Explication Microsoft du bug de l'année bissextile 1900 : https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Étape suivante : sélectionnez un échantillon Excel désensibilisé que vous êtes autorisé à utiliser, exécutez le code de détection d'époque ci-dessus et confirmez si son système de date est cohérent avec votre logique de traitement. Si des incohérences sont détectées, ajustez les paramètres de conversion avant de générer les livrables de traduction.

Utilisez cette liste de contrôle pour la traduction de documents

Décidez d’abord quel contenu est du texte, lequel est une formule et un codage commercial, puis traduisez le tableau. Le contrôle post-traduction confirme non seulement si le chinois a été converti dans la langue cible, mais confirme également que les formules, les identifiants et les relations de référence n'ont pas été modifiés.

OmniDoc (portail produit) fournit un portail de traduction de documents multiformat et le site officiel présente des fonctions d'OCR, de glossaire et de comparaison bilingue. Pour les équipes qui souhaitent travailler directement à partir des fichiers, il s’agit d’une voie qui mérite d’être évaluée avec des échantillons réels. Veuillez utiliser les fichiers désensibilisés que vous êtes autorisé à télécharger et utilisez les éléments de vérification de cet article pour examiner les résultats. Cet article ne prétend pas qu'OmniDoc utilise les bibliothèques open source ou les algorithmes internes de l'article, et n'utilise pas non plus d'exemples pour remplacer les tests de performances des produits.

Mis à jour le 2026-11-13