Excel-datumverschil is vier jaar: kijk eerst naar het datumsysteem van de werkmap

iso_dates bestuurt de datumserialisatiemethode in het bestand en verandert de datetime in het geheugen niet automatisch in een string. Het serienummer van de datum vereist het tijdperk van de werkmap; hier vergelijken we de twee datumsystemen en controleren we de opgeslagen XML- en terugleeswaarden.

Excel exporteert datums die met vier jaar zijn verschoven, en in de meeste gevallen ligt het probleem bij het datumsysteem van de werkmap, niet bij de gegevens zelf. Geschreven voor ontwikkelaars en datamensen die verantwoordelijk zijn voor rapportexports, ETL-scripts of platformonafhankelijke uitwisseling van Excel-bestanden. Wanneer u situaties tegenkomt zoals algemene datumverschuiving, getallen die niet als datums kunnen worden weergegeven, gegevensafwijkingen rond 1900, enz., kunt u eerst het probleem oplossen in de volgorde van dit artikel.

Na het lezen van dit artikel begrijpt u het verschil tussen de twee datumsystemen van 1900 en 1904, weet u hoe u workbook.epoch moet lezen om het systeem te bevestigen dat door de huidige werkmap wordt gebruikt, en beheerst u de acceptatiemethode van het controleren van XML en het teruglezen van waarden na het opslaan. De code en tabellen in dit artikel zijn geïllustreerd met synthetische voorbeelden, geschikt als checklist voordat u met echte documenten gaat werken.

Wat moet ik doen als de Excel-datum vier jaar verschilt? Conclusie in één zin

Lees eerst de workbook.epoch van de werkmap en bevestig het datumsysteem voordat u gaat converteren; Problemen met de grensdatum en tijdzone worden afzonderlijk afgehandeld.

jouw situatieAanbevolen praktijkenreden
De geëxporteerde datum wordt in totaal ongeveer 1462 dagen gecompenseerdLees eerst workbook.epoch om het datumsysteem van de werkmap te bevestigenHet verschil tussen de systemen uit 1900 en 1904 is 1462 dagen, en onjuiste aannames aan de leeszijde zullen ervoor zorgen dat alle serienummers verkeerd worden geïnterpreteerd
De cel is een getal, maar kan niet als datum worden weergegevenControleer en voltooi het number_format-datumformaatmaskerWanneer het numerieke type correct is, zullen ontbrekende formaten weergaveafwijkingen veroorzaken.
Data vóór maart 1900 of 29-02-1900 verschijnen in de gegevensMarkeer als ongeldig of overgedragen naar handmatige beoordeling, behoud het originele serienummerDeze datum bestaat niet in de Gregoriaanse kalender en mag niet worden gedwongen om te converteren
datetime met tijdzone moet worden geschrevenStrip tzinfo na uniforme conversie naar UTCExcel biedt geen ondersteuning voor het opslaan van tijdzones, alle tijden zijn lokale tijd zonder dat u zich hiervan bewust bent
Bestanden moeten tussen platforms worden uitgewisseldGeef het datumsysteem expliciet aanDe standaardinstellingen van de ontvanger zijn anders, wat een stille offset kan veroorzaken

Verschillen tussen datumsystemen uit 1900 en 1904

Een datum in een XLSX-bestand is in wezen een serienummer met drijvende komma, en de betekenis ervan hangt volledig af van het datumsysteem waaraan de werkmap is gekoppeld. De XLSX-specificatie staat twee basistijdvakken toe:

  • 1900 Datumsysteem: standaard gebruikt door Windows, serienummer 1 staat voor 1900-01-01
  • 1904 Date System: standaard gebruikt op vroege Macs, serienummer 0 staat voor 1904-01-01

Er is een vaste verschuiving van 1462 dagen tussen de twee, wat de belangrijkste bron is van het "datumverschil van vier jaar". Bovendien kent het systeem van 1900 een historisch probleem: het beschouwt 1900 ten onrechte als een schrikkeljaar, waardoor de niet-bestaande datum 29-02-1900 in Excel wordt gelegaliseerd.

Kernvergelijking

projectDatumsysteem uit 1900Datumsysteem uit 1904
Beginpunt van serienummerSerienummer 1 komt overeen met 1900-01-01Serienummer 0 komt overeen met 1904-01-01
Veelvoorkomende standaardbronnenWindowsVroege Mac
gecompenseerd door een ander systeem1462 dagen verschil1462 dagen verschil
speciale kwesties1900 wordt aangezien voor een schrikkeljaar, maar bestaat op 29-02-1900Dit artikel behandelt dergelijke kwesties niet

Waarom gegevens van vóór 1900 speciale aandacht behoeven

Als je te maken hebt met historische gegevens van vóór maart 1900, kan de datetime-module van Python niet rechtstreeks 29 februari weergeven. Volgens de officiële openpyxl-documentatie zal de bibliotheek, om compatibel te zijn met het gedrag van Excel, deze uitzondering simuleren bij het lezen van datums in januari en februari onder het 1900-systeem, maar 29-02-1900 zelf kan niet worden omgezet in een geldig Python datetime-object.

Voor de meeste moderne bedrijfsgegevens is het van belang om te identificeren welk systeem de huidige werkmap gebruikt en dit expliciet te declareren bij het uitwisselen van bestanden tussen platforms om stille drift aan de ontvangende kant als gevolg van verschillende standaardinstellingen te voorkomen.

Synthesevoorbeeld: grensinvoer en verwerkingsmethoden

Om het probleem te illustreren construeren we een synthetisch scenario: een rapport dat door een financieel systeem wordt geëxporteerd, gebruikt het datumsysteem van 1904, maar het stroomafwaartse ETL-script ontleedt het standaard volgens het systeem van 1900.

Afhandeling van fouten of grensinvoer:

  1. Als het ingevoerde serienummer 60 is en de werkmap voor het 1900-systeem is, komt dit overeen met het fictieve 29-02-1900 in Excel. Python's eigen datetime gooit ValueError.
  2. Op dit moment mag de uitzondering niet worden geforceerd, maar moet de uitzondering worden opgevangen en geregistreerd als de oorspronkelijke waarde of het speciale merkteken, omdat de datum niet bestaat in de Gregoriaanse kalender.
  3. Als een datetime-object met tijdzone-informatie wordt doorgegeven voor schrijven, zal openpyxl de tijdzone niet automatisch converteren, maar vereist dat de tzinfo eerst wordt verwijderd, anders kan er een schrijffout of fout optreden.
  4. Excel zelf ondersteunt geen tijdzoneopslag en alle tijden zijn zonder medeweten lokale tijd.

Datumsysteemdetectie en veilige conversiecode

Het volgende voorbeeld laat zien hoe u veilig omgaat met datumsysteemverschillen in het geheugen. De code is alleen bedoeld voor logische demonstratie en voert niet het daadwerkelijke lezen en schrijven van bestanden uit. Het moet worden uitgevoerd in uw eigen vergrendelde afhankelijkheidsomgeving. Openpyxl >= 3.1.0 wordt aanbevolen. De voorbeelden omvatten geen netwerkverzoeken of bewerkingen voor het overschrijven van bestanden; alle beweringen zijn gebaseerd op synthetische gegevens.

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

Acceptatiecriteria en grenzen voor handmatige beoordeling

Observeer verschijnseleninvoer- of randvoorwaardenverwachte output of verwerkingsbeslissingOf automatisering van toepassing is
Alle datums worden uniform gecompenseerd met 1462 dagenwb.epoch is inconsistent met analytische aannamesLees wb.epoch en converteer het volgnummer opnieuwJa
29-02-1900 verschijnt in de gegevens1900 systeem met serienummer 60Gemarkeerd als ongeldige datum, behoud origineel serienummer 60Nee, u moet de zakelijke betekenis handmatig bevestigen
Een deel van de tijd ontbreekt of is misplaatstVoer datetime in met tzinfoConverteer uniform naar UTC en strip vervolgens tzinfo om te schrijvenonderdeel, moet u de doeltijdzone handmatig definiëren
Cel geeft het getal weer, maar is opgemaakt als datumHet numerieke type is correct, maar number_format ontbreektControleer en vul het datumformaatmasker inJa
Historische data (vóór 1900-01-01) worden abnormaal weergegevenDatum eerder dan 01-01-1900Gebruik in plaats daarvan tekstopslag of een speciale historische databaseNee, XLSX is niet geschikt voor dit scenario

Opgemerkt moet worden dat de codedemonstratie alleen de juistheid van de conversielogica verifieert en niet gelijk is aan het end-to-end-effect. Echte bestanden kunnen meerdere datumnotaties, voorwaardelijke notaties of datums bevatten die zijn gegenereerd door formules, waarvoor extra parseerlagen nodig zijn. Wanneer u data vóór maart 1900 tegenkomt, samenwerkingsgegevens tussen verschillende tijdzones of niet-standaard kalenders (zoals de maankalender, het fiscale jaar), moet u een handmatig beoordelingsproces starten en mogen geautomatiseerde scripts geen ongeoorloofde correcties aanbrengen.

🎯 Welke methode is geschikt voor jou?

Als u de datum uit het exportbestand wilt lezen

Lees eerst workbook.epoch, bevestig het datumsysteem en beslis vervolgens of u het serienummer opnieuw wilt converteren.

Als uw gegevens betrekking hebben op data vóór maart 1900

Markeer de records met betrekking tot 29-02-1900 als ongeldig, behoud het originele serienummer en overhandig het aan handmatige bevestiging van de zakelijke betekenis.

Als u tijd met tijdzone in Excel wilt schrijven

Converteer eerst uniform naar UTC en verwijder vervolgens tzinfo; de doeltijdzone moet handmatig worden gedefinieerd.

Als u bestanden wilt uitwisselen met andere systemen

Geef het datumsysteem expliciet aan en valideer de terugleesdatumwaarden aan de ontvangende kant.

❓ Veelgestelde vragen (FAQ)

1. Waarom wordt de geëxporteerde datum ongeveer vier jaar verschoven?

Een veel voorkomende oorzaak is dat het datumsysteem van de werkmap inconsistent is met de aannames aan de leeskant. Het verschil tussen de twee systemen van 1900 en 1904 bedraagt 1462 dagen.

2. Zal iso_dates datetime automatisch in een string veranderen?

Zal niet. iso_dates bestuurt alleen de datumserialisatiemethode in het bestand en converteert datetime in het geheugen niet automatisch naar een string.

3. Waarom kan 29-02-1900 niet worden geconverteerd naar DateTime in Python?

1900 Het systeem beschouwt 1900 ten onrechte als een schrikkeljaar, waardoor 29-02-1900 wel bestaat in Excel, maar de dag bestaat niet in de Gregoriaanse kalender. Python's datetime gooit ValueError, in welk geval de originele numerieke waarde of de speciale vlag moet worden vastgelegd.

4. Hoe schrijf ik datetime met tijdzone in Excel?

Excel ondersteunt het opslaan van tijdzones niet. Het moet eerst uniform worden geconverteerd naar UTC en vervolgens worden ontdaan van tzinfo voordat het wordt geschreven; openpyxl voltooit niet automatisch de tijdzoneconversie.

📝 Samenvatting

Problemen met datumverschuiving komen meestal voort uit het datumsysteem van de werkmap. Als u eerst workbook.epoch bevestigt voordat u converteert, kunt u de meeste stille fouten voorkomen. Problemen met grensdatum en tijdzone moeten worden doorverwezen naar menselijke beoordeling.

Probeer het nu: upload het document om de vertaling te starten, waarbij de oorspronkelijke lay-out behouden blijft

Referenties en volgende stappen

  • openpyxl officiële datum- en tijddocumentatie: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Opmerking van Microsoft over het datumsysteem 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Microsoft-uitleg over de schrikkeljaarbug uit 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Volgende stap: Selecteer een ongevoelig Excel-voorbeeld waarvoor u toestemming heeft om te gebruiken, voer de bovenstaande tijdperkdetectiecode uit en bevestig of het datumsysteem consistent is met uw verwerkingslogica. Als er inconsistenties worden gevonden, pas dan de conversieparameters aan voordat u vertaalresultaten genereert.

Gebruik deze checklist voor documentvertaling

Bepaal eerst welke inhoud tekst is, dat wil zeggen formule- en bedrijfscodering, en vertaal vervolgens de tabel. Controle na de vertaling bevestigt niet alleen of het Chinees naar de doeltaal is omgezet, maar bevestigt ook dat formules, identificatiegegevens en referentierelaties niet zijn gewijzigd.

OmniDoc (productportaal) biedt een documentvertalingsportaal in meerdere formaten, en de officiële website introduceert OCR-, woordenlijst- en tweetalige vergelijkingsfuncties. Voor teams die rechtstreeks vanuit de bestanden willen werken, is dit een pad dat de moeite waard is om te evalueren met praktijkvoorbeelden. Gebruik ongevoelige bestanden waarvoor u toestemming heeft om te uploaden, en gebruik de controle-items in dit artikel om de resultaten te bekijken. In dit artikel wordt niet beweerd dat OmniDoc de open source-bibliotheken of interne algoritmen in het artikel gebruikt, noch worden er voorbeelden gebruikt ter vervanging van het testen van productprestaties.

Bijgewerkt op 2026-11-13