Mengapa Excel hari kerja salah untuk 1900?

27

Pertanyaan ini didasarkan pada pengamatan AdamV dalam jawabannya tentang Bagaimana cara memasukkan nama hari ke dalam sel di Excel?

Ketika A1 memiliki nilai 2009-08-01, maka:

  • =WEEKDAY(A1) akan mendapatkan 7
  • =TEXT(7, "dddd") akan mendapatkan Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") akan mendapatkan Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") akan mendapatkan Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") juga akan mendapatkan Sunday, 1900-01-01

Dua yang terakhir salah: tanggal 1 Januari 1900 sebenarnya adalah hari Senin.
Berbagai sumber tampaknya menegaskan bahwa:

Apa yang saya lewatkan? Mengapa Excel melakukan kesalahan ini?

Jeroen Wiert Pluimer
sumber
1
Berkat pertanyaan ini, saya telah sedikit menulis ulang jawaban saya sebelumnya untuk memperjelas bahwa 1/1/1900 bukan hari Minggu, tetapi Excel berpikir itu. Ketidakakuratan tidak mengubah substansi dari jawaban sebelumnya yaitu bahwa menggunakan angka hari kerja sebagai dasar untuk menghasilkan teks yang diformat agar terlihat seperti tanggal cacat dan tidak perlu.
AdamV

Jawaban:

40

Seperti yang dijelaskan dalam Microsoft KB 214058 :

Hari-hari dalam seminggu sebelum 1 Maret 1900 salah di Excel

INFORMASI LEBIH LANJUT

Ketika sistem tanggal di Microsoft Excel dibuat, ia dirancang agar sepenuhnya kompatibel dengan sistem tanggal yang digunakan oleh program spreadsheet lainnya.

Namun, dalam sistem tanggal ini, tahun 1900 secara keliru diartikan sebagai tahun kabisat. Karena tidak ada 29 Februari ("hari kabisat") pada tahun 1900, hari dalam seminggu untuk tanggal apa pun sebelum 1 Maret 1900 (hari setelah "hari kabisat"), tidak dihitung dengan benar.

"Program spreadsheet lain" merujuk ke Lotus 1-2-3 , yang cukup populer saat itu, dan secara keliru menganggap bahwa tahun 1900 adalah tahun kabisat. Ini dijelaskan lebih detail lagi di KB 214326 :

Excel 2000 salah mengasumsikan bahwa tahun 1900 adalah tahun kabisat

INFORMASI LEBIH LANJUT

Ketika Lotus 1-2-3 pertama kali dirilis, program mengasumsikan bahwa tahun 1900 adalah tahun kabisat, meskipun sebenarnya bukan tahun kabisat. Ini membuatnya lebih mudah bagi program untuk menangani tahun kabisat dan tidak menyebabkan kerusakan pada hampir semua perhitungan tanggal di Lotus 1-2-3.

Ketika Microsoft Multiplan dan Microsoft Excel dirilis, mereka juga berasumsi bahwa 1900 adalah tahun kabisat. Asumsi ini memungkinkan Microsoft Multiplan dan Microsoft Excel untuk menggunakan sistem tanggal seri yang sama yang digunakan oleh Lotus 1-2-3 dan memberikan kompatibilitas yang lebih besar dengan Lotus 1-2-3. Memperlakukan 1900 sebagai tahun kabisat juga memudahkan pengguna untuk memindahkan lembar kerja dari satu program ke program lainnya.

Meskipun secara teknis dimungkinkan untuk memperbaiki perilaku ini sehingga versi Microsoft Excel saat ini tidak berasumsi bahwa 1900 adalah tahun kabisat, kerugian melakukannya lebih besar daripada keuntungannya.

Jika perilaku ini diperbaiki, banyak masalah akan muncul, termasuk yang berikut:

  • Hampir semua tanggal di lembar kerja Microsoft Excel saat ini dan dokumen lainnya akan berkurang satu hari. Memperbaiki perubahan ini akan membutuhkan banyak waktu dan upaya, terutama dalam formula yang menggunakan tanggal.
  • Beberapa fungsi, seperti fungsi WEEKDAY, akan mengembalikan nilai yang berbeda; ini mungkin menyebabkan rumus di lembar kerja berfungsi salah.
  • Memperbaiki perilaku ini akan merusak kompatibilitas tanggal seri antara Microsoft Excel dan program lain yang menggunakan tanggal.

Jika perilaku tetap tidak diperbaiki, hanya satu masalah terjadi:

  • Fungsi WEEKDAY mengembalikan nilai yang salah untuk tanggal sebelum 1 Maret 1900. Karena sebagian besar pengguna tidak menggunakan tanggal sebelum 1 Maret 1900, masalah ini jarang terjadi.
grawity
sumber
10
Berikut ini adalah cerita terkait dari Joel Spolsky milik
matt
5
Lihat juga . Banyak programmer salah berasumsi bahwa bekerja dengan tanggal / waktu itu mudah :)
BlueRaja - Danny Pflughoeft
3
NitpicK historis: ketika Anda mengatakan 1-2-3 adalah "cukup populer" yang Anda maksudkan itu dulu spreadsheet yang dominan.
Isaac Rabinovitch
12

Berikut adalah alasan yang dijelaskan oleh Joel sendiri: Ulasan BillG Pertama Saya

Basic menggunakan 31 Desember 1899 sebagai zaman bukannya 1 Januari 1900, tetapi untuk beberapa alasan, tanggal hari ini sama di Excel seperti di Basic.

Hah?

Saya pergi mencari pengembang Excel yang cukup tua untuk mengingat alasannya. Ed Fries sepertinya tahu jawabannya.

"Oh," katanya padaku. "Lihat 28 Februari 1900."

"Ini 59," kataku.

"Sekarang coba 1 Maret."

"Ini 61!"

"Apa yang terjadi pada 60?" Ed bertanya.

"29 Februari. 1900 adalah tahun kabisat! Ini habis dibagi 4!"

"Tebakan bagus, tapi jangan cerutu," kata Ed, dan membuatku bertanya-tanya untuk sementara waktu.

Ups. Saya melakukan riset. Tahun yang habis dibagi 100 bukan tahun kabisat, kecuali mereka juga habis dibagi 400.

1900 bukan tahun kabisat.

"Itu bug di Excel!" Saya berseru.

"Yah, tidak juga," kata Ed. "Kami harus melakukannya dengan cara itu karena kami harus dapat mengimpor lembar kerja Lotus 123."

"Jadi, ini bug di Lotus 123?"

"Ya, tapi mungkin yang disengaja. Lotus harus muat di 640K. Itu tidak banyak memori. Jika Anda mengabaikan 1900, Anda dapat mengetahui apakah tahun tertentu adalah tahun kabisat hanya dengan mencari untuk melihat apakah dua bit paling kanan nol. Itu sangat cepat dan mudah. ​​Orang-orang Lotus mungkin berpikir itu tidak masalah salah selama dua bulan di masa lalu.

Giorgi
sumber
1
@ JoeroenWiertPluimers: Sebenarnya jawaban saya dengan tautan ini telah dihapus oleh moderator dan saya memutuskan untuk memperluas jawaban saya.
Giorgi
2

Salah satu solusi untuk ini adalah menambahkan 400 tahun ke tahun, untuk menyelesaikan hari kerja seperti dalam rumus berikut = WEEKDAY (DATE (A4 + 400, B4, C4), 1) jadi jika A4 = 1834 B4 = 12 C4 = 14 ini akan mengembalikan 1 (Minggu) yang sama dengan untuk 14 Desember 2234 Ini berhenti bekerja untuk tanggal sebelum 1753 tahun setelah perubahan ke kalender Gregorian

Adrian
sumber