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 Anda | Praktik yang direkomendasikan | alasan |
|---|---|---|
| Tanggal yang diekspor secara keseluruhan diimbangi sekitar 1462 hari | Baca workbook.epoch terlebih dahulu untuk mengonfirmasi sistem tanggal buku kerja | Perbedaan 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 tanggal | Periksa dan lengkapi masker format tanggal number_format | Jika tipe numeriknya benar, format yang hilang akan menyebabkan tampilan tidak normal. |
| Tanggal sebelum Maret 1900 atau 29-02-1900 muncul di data | Tandai sebagai tidak valid atau dipindahkan ke tinjauan manual, pertahankan nomor seri aslinya | Tanggal ini tidak ada dalam kalender Masehi dan tidak boleh dipaksa untuk diubah |
datetime dengan zona waktu perlu ditulis | Hapus tzinfo setelah konversi terpadu ke UTC | Excel tidak mendukung penyimpanan zona waktu, semua waktu adalah waktu lokal tanpa kesadaran |
| File perlu dipertukarkan antar platform | Deklarasikan sistem tanggal secara eksplisit | Pengaturan 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
| proyek | sistem tanggal 1900 | sistem tanggal 1904 |
|---|---|---|
| Titik awal nomor seri | Nomor seri 1 sesuai dengan 01-01-1900 | Nomor seri 0 sesuai dengan 01-01-1904 |
| Sumber default umum | Windows | Mac Awal |
| diimbangi dari sistem lain | Perbedaan 1462 hari | Perbedaan 1462 hari |
| masalah khusus | Dikira tahun 1900 sebagai tahun kabisat, ada tahun 1900-02-29 | Artikel 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:
- Jika nomor seri masukan adalah 60 dan buku kerja untuk sistem 1900, maka ini sesuai dengan fiksi 1900-02-29 di Excel.
datetimeasli Python melemparValueError. - 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.
- Jika objek
datetimedengan 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. - 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 fenomena | kondisi masukan atau batas | keluaran yang diharapkan atau keputusan pemrosesan | Apakah otomatisasi dapat diterapkan |
|---|---|---|---|
| Semua tanggal diimbangi secara seragam sebanyak 1462 hari | wb.epoch tidak konsisten dengan asumsi analitik | Baca wb.epoch dan konversi ulang nomor urutnya | Ya |
| 29-02-1900 muncul di data | Sistem 1900 dengan nomor seri 60 | Ditandai sebagai tanggal tidak valid, tetap mempertahankan nomor seri asli 60 | Tidak, Anda perlu mengonfirmasi maksud bisnis secara manual |
| Sebagian waktu hilang atau salah tempat | Masukkan datetime dengan tzinfo | Konversikan ke UTC secara seragam dan kemudian hapus tzinfo untuk menulis | sebagian, Anda perlu menentukan zona waktu target secara manual |
| Sel menampilkan nomor tetapi diformat sebagai tanggal | Jenis numerik benar tetapi number_format tidak ada | Periksa dan lengkapi masker format tanggal | Ya |
| Tanggal bersejarah (sebelum 01-01-1900) ditampilkan secara tidak normal | Tanggal lebih awal dari 01-01-1900 | Gunakan penyimpanan teks atau database sejarawan khusus | Tidak, 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.
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.


