Tại sao các ngày trong tuần Excel sai cho năm 1900?


27

Câu hỏi này dựa trên những quan sát của AdamV trong câu trả lời của anh ấy về Làm thế nào để tôi lấy tên ngày vào một ô trong Excel?

Khi A1 có giá trị 2009-08-01, thì:

  • =WEEKDAY(A1) sẽ có được 7
  • =TEXT(7, "dddd") sẽ có được Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") sẽ có được Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") sẽ có được Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") cũng sẽ có được Sunday, 1900-01-01

Hai cái cuối cùng là sai: ngày 1 tháng 1 năm 1900 thực sự là thứ Hai.
Nhiều nguồn khác nhau dường như xác nhận rằng:

Tôi đang thiếu gì? Tại sao Excel làm điều này sai?


1
Nhờ câu hỏi này, tôi đã điều chỉnh lại câu trả lời trước đó của mình một chút để làm rõ rằng 1/1/1900 không phải là Chủ nhật, nhưng Excel nghĩ rằng nó là như vậy. Sự không chính xác không làm thay đổi nội dung của câu trả lời trước đó, đó là việc sử dụng số ngày trong tuần làm cơ sở để tạo văn bản được định dạng để trông giống như một ngày là thiếu sót và không cần thiết.
AdamV

Câu trả lời:


40

Như được mô tả trong Microsoft KB 214058 :

Các ngày trong tuần trước ngày 1 tháng 3 năm 1900 không chính xác trong Excel

THÊM THÔNG TIN

Khi hệ thống ngày trong Microsoft Excel ban đầu được tạo, nó được thiết kế để hoàn toàn tương thích với các hệ thống ngày được sử dụng bởi các chương trình bảng tính khác.

Tuy nhiên, trong hệ thống ngày này, năm 1900 được hiểu không chính xác là năm nhuận. Bởi vì không có ngày 29 tháng 2 ("ngày nhuận") trong năm 1900, ngày trong tuần cho bất kỳ ngày nào trước ngày 1 tháng 3 năm 1900 (ngày sau "ngày nhuận"), không được tính toán chính xác.

"Các chương trình bảng tính khác" đề cập đến Lotus 1-2-3 , lúc đó khá phổ biến và giả định không chính xác rằng năm 1900 là một năm nhuận. Điều này được giải thích chi tiết hơn nữa trong KB 214326 :

Excel 2000 giả định không chính xác rằng năm 1900 là năm nhuận

THÊM THÔNG TIN

Khi Lotus 1-2-3 được phát hành lần đầu tiên, chương trình cho rằng năm 1900 là một năm nhuận, mặc dù thực sự nó không phải là một năm nhuận. Điều này giúp chương trình xử lý năm nhuận dễ dàng hơn và không gây hại cho hầu hết tất cả các tính toán ngày trong Lotus 1-2-3.

Khi Microsoft Multiplan và Microsoft Excel được phát hành, họ cũng cho rằng 1900 là một năm nhuận. Giả định này cho phép Microsoft Multiplan và Microsoft Excel sử dụng cùng một hệ thống ngày nối tiếp được sử dụng bởi Lotus 1-2-3 và cung cấp khả năng tương thích cao hơn với Lotus 1-2-3. Việc coi 1900 là một năm nhuận cũng giúp người dùng dễ dàng di chuyển bảng tính từ chương trình này sang chương trình khác.

Mặc dù về mặt kỹ thuật có thể sửa hành vi này để các phiên bản Microsoft Excel hiện tại không cho rằng 1900 là một năm nhuận, nhưng nhược điểm của việc này vượt trội hơn nhiều so với các lợi thế.

Nếu hành vi này được sửa chữa, nhiều vấn đề sẽ phát sinh, bao gồm:

  • Hầu như tất cả các ngày trong bảng tính Microsoft Excel hiện tại và các tài liệu khác sẽ bị giảm một ngày. Điều chỉnh sự thay đổi này sẽ tốn thời gian và công sức đáng kể, đặc biệt là trong các công thức sử dụng ngày.
  • Một số hàm, chẳng hạn như hàm WEEKDAY, sẽ trả về các giá trị khác nhau; điều này có thể khiến các công thức trong bảng tính hoạt động không chính xác.
  • Sửa hành vi này sẽ phá vỡ tính tương thích ngày nối tiếp giữa Microsoft Excel và các chương trình khác sử dụng ngày.

Nếu hành vi vẫn không được khắc phục, chỉ có một vấn đề xảy ra:

  • Hàm WEEKDAY trả về các giá trị không chính xác cho các ngày trước ngày 1 tháng 3 năm 1900. Bởi vì hầu hết người dùng không sử dụng ngày trước ngày 1 tháng 3 năm 1900, vấn đề này rất hiếm.

10
Đây là một câu chuyện liên quan từ Joel Spolsky của Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt

5
Xem thêm . Nhiều lập trình viên cho rằng không chính xác rằng làm việc với ngày / lần là dễ dàng :)
BlueRaja - Danny Pflughoeft

3
NitpicK lịch sử: khi bạn nói 1-2-3 là "khá phổ biến", bạn có nghĩa là nó đã từng là bảng tính thống trị.
Isaac Rabinovitch

12

Đây là lý do được giải thích bởi chính Joel: Đánh giá BillG đầu tiên của tôi

Basic sử dụng ngày 31 tháng 12 năm 1899 làm kỷ nguyên thay vì ngày 1 tháng 1 năm 1900, nhưng vì một số lý do, ngày hôm nay cũng giống như trong Excel như trong Basic.

Huh?

Tôi đã đi tìm một nhà phát triển Excel đủ tuổi để nhớ tại sao. Ed Fries dường như biết câu trả lời.

"Ồ," anh nói với tôi. "Kiểm tra ngày 28 tháng 2 năm 1900."

"Đó là 59," tôi nói.

"Bây giờ hãy thử ngày 1 tháng 3."

"Đó là 61!"

"Chuyện gì đã xảy ra với 60?" Ed hỏi.

"Ngày 29 tháng 2 năm 1900 là một năm nhuận! Nó chia hết cho 4!"

"Đoán đúng, nhưng không có xì gà," Ed nói và khiến tôi băn khoăn một lúc.

Rất tiếc. Tôi đã làm một số nghiên cứu. Số năm chia hết cho 100 không phải là năm nhuận, trừ khi chúng cũng chia hết cho 400.

Năm 1900 không phải là một năm nhuận.

"Đó là một lỗi trong Excel!" Tôi kêu lên.

"Chà, không hẳn vậy," Ed nói. "Chúng tôi đã phải làm theo cách đó bởi vì chúng tôi cần có thể nhập bảng tính Lotus 123."

"Vì vậy, đó là một lỗi trong Lotus 123?"

"Vâng, nhưng có lẽ là một chủ ý. Lotus phải phù hợp với 640K. Đó không phải là nhiều bộ nhớ. Nếu bạn bỏ qua 1900, bạn có thể nhận ra nếu một năm nhất định là một năm nhuận chỉ bằng cách xem liệu hai bit ngoài cùng bên phải bằng không. Điều đó thực sự nhanh chóng và dễ dàng. Các chàng trai Lotus có lẽ đã nghĩ rằng điều đó không có vấn đề gì trong hai tháng qua.


1
@JeroenWiertPluimers: Thật ra câu trả lời của tôi với liên kết này đã bị người điều hành xóa và tôi quyết định mở rộng câu trả lời của mình.
Giorgi

2

Một giải pháp cho vấn đề này là thêm 400 năm vào năm, để giải quyết các ngày trong tuần như trong công thức sau = TUẦN (NGÀY (A4 + 400, B4, C4), 1) vì vậy nếu A4 = 1834 B4 = 12 C4 = 14 điều này sẽ trở lại 1 (Chủ nhật), tương tự như vào ngày 14 tháng 12 năm 2234 Điều này sẽ ngừng hoạt động cho các ngày trước năm 1753 sau khi thay đổi lịch Gregorian

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.