Perbedaan tanggal Excel adalah empat tahun: pertama lihat sistem tanggal buku kerja

iso_dates mengontrol metode serialisasi tanggal dalam file dan tidak secara otomatis mengubah tanggal waktu di memori menjadi string. Nomor seri tanggal memerlukan zaman buku kerja; di sini kita membandingkan dua sistem tanggal dan memeriksa XML yang disimpan dan nilai readback.

Excel mengekspor tanggal yang diimbangi dengan empat tahun, dan dalam sebagian besar kasus, masalahnya ada pada sistem tanggal buku kerja, bukan data itu sendiri. Ditulis untuk pengembang dan orang data yang bertanggung jawab atas ekspor laporan, skrip ETL, atau pertukaran file Excel lintas platform. Saat Anda menghadapi situasi seperti pergeseran tanggal secara keseluruhan, angka yang tidak dapat ditampilkan sebagai tanggal, anomali data sekitar tahun 1900, dll., Anda dapat memecahkan masalah terlebih dahulu sesuai urutan artikel ini.

Setelah membaca artikel ini, Anda akan memahami perbedaan antara dua sistem tanggal 1900 dan 1904, mengetahui cara membaca workbook.epoch untuk mengonfirmasi sistem yang digunakan oleh buku kerja saat ini, dan menguasai metode penerimaan pemeriksaan XML dan membaca kembali nilai setelah menyimpan. Kode dan tabel dalam artikel ini diilustrasikan dengan sampel sintetis, cocok sebagai daftar periksa sebelum bekerja dengan dokumen nyata.

Apa yang harus saya lakukan jika tanggal Excel berbeda empat tahun? Kesimpulan satu kalimat

Pertama-tama baca workbook.epoch buku kerja dan konfirmasikan sistem tanggal sebelum mengonversi; masalah batas tanggal dan zona waktu ditangani secara terpisah.

situasi AndaPraktik yang direkomendasikanalasan
Tanggal yang diekspor secara keseluruhan diimbangi sekitar 1462 hariBaca workbook.epoch terlebih dahulu untuk mengonfirmasi sistem tanggal buku kerjaPerbedaan antara sistem 1900 dan 1904 adalah 1462 hari, dan asumsi yang salah pada sisi pembacaan akan menyebabkan semua nomor seri disalahartikan
Sel adalah angka tetapi tidak dapat ditampilkan sebagai tanggalPeriksa dan lengkapi masker format tanggal number_formatJika tipe numeriknya benar, format yang hilang akan menyebabkan tampilan tidak normal.
Tanggal sebelum Maret 1900 atau 29-02-1900 muncul di dataTandai sebagai tidak valid atau dipindahkan ke tinjauan manual, pertahankan nomor seri aslinyaTanggal ini tidak ada dalam kalender Masehi dan tidak boleh dipaksa untuk diubah
datetime dengan zona waktu perlu ditulisHapus tzinfo setelah konversi terpadu ke UTCExcel tidak mendukung penyimpanan zona waktu, semua waktu adalah waktu lokal tanpa kesadaran
File perlu dipertukarkan antar platformDeklarasikan sistem tanggal secara eksplisitPengaturan default receiver berbeda, sehingga dapat menghasilkan offset senyap

Perbedaan antara sistem penanggalan 1900 dan 1904

Tanggal dalam file XLSX pada dasarnya adalah nomor seri floating-point, dan maknanya bergantung sepenuhnya pada sistem tanggal yang terikat pada buku kerja. Spesifikasi XLSX memungkinkan dua periode dasar:

  • Sistem Tanggal 1900: digunakan oleh Windows secara default, nomor seri 1 mewakili 01-01-1900
  • Sistem Tanggal 1904: Digunakan secara default pada Mac awal, nomor seri 0 mewakili 01-01-1904

Ada selisih tetap sebesar 1462 hari di antara keduanya, yang merupakan sumber utama "perbedaan tanggal empat tahun". Selain itu, sistem tahun 1900 mempunyai masalah historis: sistem ini salah memperlakukan tahun 1900 sebagai tahun kabisat, sehingga menyebabkan tanggal 29-02-1900 yang tidak ada dilegalkan di Excel.

Perbandingan inti

proyeksistem tanggal 1900sistem tanggal 1904
Titik awal nomor seriNomor seri 1 sesuai dengan 01-01-1900Nomor seri 0 sesuai dengan 01-01-1904
Sumber default umumWindowsMac Awal
diimbangi dari sistem lainPerbedaan 1462 hariPerbedaan 1462 hari
masalah khususDikira tahun 1900 sebagai tahun kabisat, ada tahun 1900-02-29Artikel ini tidak membahas masalah tersebut

Mengapa data sebelum tahun 1900 memerlukan perhatian khusus

Jika Anda berurusan dengan data historis sebelum Maret 1900, modul datetime Python tidak dapat secara langsung mewakili tanggal 29 Februari. Menurut dokumentasi resmi openpyxl, agar kompatibel dengan perilaku Excel, perpustakaan akan mensimulasikan pengecualian ini ketika membaca tanggal pada bulan Januari dan Februari di bawah sistem 1900, tetapi 29-02-1900 sendiri tidak dapat diubah menjadi objek Python datetime yang valid.

Untuk sebagian besar data bisnis modern, kuncinya adalah mengidentifikasi sistem mana yang digunakan buku kerja saat ini dan mendeklarasikannya secara eksplisit saat bertukar file lintas platform untuk menghindari penyimpangan diam-diam di pihak penerima karena pengaturan default yang berbeda.

Contoh sintesis: input batas dan metode pemrosesan

Untuk mengilustrasikan masalahnya, kami membuat skenario sintetik: laporan yang diekspor oleh sistem keuangan menggunakan sistem tanggal 1904, namun skrip ETL hilir menguraikannya berdasarkan sistem tahun 1900 secara default.

Penanganan masukan yang salah atau batas:

  1. Jika nomor seri masukan adalah 60 dan buku kerja untuk sistem 1900, maka ini sesuai dengan fiksi 1900-02-29 di Excel. datetime asli Python melempar ValueError.
  2. Pada saat ini pengecualian tersebut tidak boleh dipaksakan, tetapi pengecualian tersebut harus ditangkap dan dicatat sebagai nilai asli atau tanda khusus, karena tanggal tersebut tidak ada dalam penanggalan Masehi.
  3. Jika objek datetime dengan informasi zona waktu diteruskan untuk penulisan, openpyxl tidak akan secara otomatis mengubah zona waktu, tetapi memerlukan tzinfo untuk dihapus terlebih dahulu, jika tidak, kesalahan atau kesalahan penulisan dapat terjadi.
  4. Excel sendiri tidak mendukung penyimpanan zona waktu, dan semua waktu adalah waktu lokal tanpa disadari.

Deteksi sistem tanggal dan kode konversi yang aman

Contoh berikut menunjukkan cara menangani perbedaan sistem tanggal dalam memori dengan aman. Kode ini hanya untuk demonstrasi logis dan tidak melakukan pembacaan dan penulisan file yang sebenarnya. Itu perlu dijalankan di lingkungan ketergantungan Anda yang terkunci. Openpyxl >= 3.1.0 direkomendasikan. Contohnya tidak mencakup permintaan jaringan atau operasi penimpaan file, semua pernyataan didasarkan pada data sintetis.

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

Kriteria penerimaan dan batasan tinjauan manual

Amati fenomenakondisi masukan atau bataskeluaran yang diharapkan atau keputusan pemrosesanApakah otomatisasi dapat diterapkan
Semua tanggal diimbangi secara seragam sebanyak 1462 hariwb.epoch tidak konsisten dengan asumsi analitikBaca wb.epoch dan konversi ulang nomor urutnyaYa
29-02-1900 muncul di dataSistem 1900 dengan nomor seri 60Ditandai sebagai tanggal tidak valid, tetap mempertahankan nomor seri asli 60Tidak, Anda perlu mengonfirmasi maksud bisnis secara manual
Sebagian waktu hilang atau salah tempatMasukkan datetime dengan tzinfoKonversikan ke UTC secara seragam dan kemudian hapus tzinfo untuk menulissebagian, Anda perlu menentukan zona waktu target secara manual
Sel menampilkan nomor tetapi diformat sebagai tanggalJenis numerik benar tetapi number_format tidak adaPeriksa dan lengkapi masker format tanggalYa
Tanggal bersejarah (sebelum 01-01-1900) ditampilkan secara tidak normalTanggal lebih awal dari 01-01-1900Gunakan penyimpanan teks atau database sejarawan khususTidak, XLSX tidak cocok untuk skenario ini

Perlu dicatat bahwa demonstrasi kode hanya memverifikasi kebenaran logika konversi dan tidak sama dengan efek ujung ke ujung. File sebenarnya mungkin berisi beberapa format tanggal, format bersyarat, atau tanggal yang dihasilkan oleh rumus, yang memerlukan lapisan penguraian tambahan. Saat menemukan tanggal sebelum Maret 1900, data kolaborasi lintas zona waktu, atau kalender non-standar (seperti kalender lunar, tahun fiskal), Anda harus melakukan proses peninjauan manual, dan skrip otomatis tidak boleh melakukan koreksi yang tidak sah.

🎯 Metode mana yang cocok untuk Anda?

Jika Anda perlu membaca tanggal dari file ekspor

Pertama-tama baca workbook.epoch, konfirmasikan sistem tanggal, lalu putuskan apakah akan mengonversi ulang nomor serinya.

Jika data Anda mencakup tanggal sebelum Maret 1900

Tandai catatan yang terkait dengan 29-02-1900 sebagai tidak valid, pertahankan nomor seri aslinya, dan serahkan ke konfirmasi manual mengenai makna bisnis.

Jika Anda perlu menulis waktu dengan zona waktu ke dalam Excel

Pertama-tama konversikan ke UTC secara seragam, lalu hapus tzinfo; zona waktu target perlu ditentukan secara manual.

Jika Anda ingin bertukar file dengan sistem lain

Deklarasikan sistem tanggal secara eksplisit dan validasi nilai tanggal pembacaan kembali di pihak penerima.

❓ Pertanyaan yang Sering Diajukan (FAQ)

1. Mengapa tanggal ekspor digeser sekitar empat tahun?

Penyebab umumnya adalah sistem tanggal buku kerja tidak konsisten dengan asumsi di sisi pembacaan. Selisih antara kedua sistem tahun 1900 dan 1904 adalah 1462 hari.

2. Akankah iso_dates secara otomatis mengubah datetime menjadi string?

Tidak akan. iso_dates hanya mengontrol metode serialisasi tanggal dalam file, dan tidak secara otomatis mengubah datetime di memori menjadi string.

3. Mengapa 29-02-1900 tidak dapat dikonversi ke waktu waktu Python?

1900 Sistem salah memperlakukan tahun 1900 sebagai tahun kabisat, menyebabkan 29-02-1900 ada di Excel, namun hari tersebut tidak ada di kalender Gregorian. datetime Python menampilkan ValueError, dalam hal ini nilai numerik asli atau tanda khusus harus dicatat.

4. Bagaimana cara menulis datetime dengan zona waktu ke dalam Excel?

Excel tidak mendukung penyimpanan zona waktu. Ini harus dikonversi secara seragam ke UTC terlebih dahulu, kemudian tzinfo dihapus sebelum ditulis; openpyxl tidak akan secara otomatis menyelesaikan konversi zona waktu.

📝 Ringkasan

Masalah offset tanggal biasanya muncul dari sistem tanggal buku kerja. Mengonfirmasi workbook.epoch terlebih dahulu sebelum mengonversi dapat menghindari sebagian besar kesalahan diam-diam. Masalah batas tanggal dan zona waktu harus dirujuk ke tinjauan manusia.

Coba sekarang: Unggah dokumen untuk memulai penerjemahan, dengan tetap mempertahankan tata letak aslinya

Referensi dan langkah selanjutnya

  • dokumentasi tanggal dan waktu resmi openpyxl: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Catatan Microsoft tentang sistem tanggal 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Penjelasan Microsoft tentang bug tahun kabisat 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Langkah berikutnya: Pilih sampel Excel yang tidak peka yang Anda punya izin untuk menggunakannya, jalankan kode deteksi zaman di atas, dan konfirmasikan apakah sistem tanggalnya konsisten dengan logika pemrosesan Anda. Jika ditemukan ketidakkonsistenan, sesuaikan parameter konversi sebelum menghasilkan hasil terjemahan.

Gunakan daftar periksa ini untuk terjemahan dokumen

Tentukan dulu konten mana yang berupa teks, mana rumus dan pengkodean bisnis, lalu terjemahkan tabelnya. Pemeriksaan pasca-terjemahan tidak hanya memastikan apakah bahasa Mandarin telah diubah ke dalam bahasa target, tetapi juga memastikan bahwa rumus, pengidentifikasi, dan hubungan referensi tidak diubah.

OmniDoc (portal produk) menyediakan portal terjemahan dokumen multi-format, dan situs resminya memperkenalkan fungsi OCR, glosarium, dan perbandingan bilingual. Untuk tim yang ingin bekerja langsung dari file, ini adalah jalur yang layak dievaluasi dengan sampel kehidupan nyata. Harap gunakan file yang tidak peka dan Anda mempunyai izin untuk mengunggahnya, dan gunakan item centang dalam artikel ini untuk meninjau hasilnya. Artikel ini tidak mengklaim bahwa OmniDoc menggunakan perpustakaan sumber terbuka atau algoritma internal dalam artikel, juga tidak menggunakan contoh untuk menggantikan pengujian kinerja produk.

Diperbarui 2026-11-13