เหตุใด Excel ในวันธรรมดาถึงผิดปี 1900


27

คำถามนี้ขึ้นอยู่กับการสังเกตของAdamVในคำตอบของเขาในฉันจะได้ชื่อวันในเซลล์ใน Excel ได้อย่างไร

เมื่อ A1 มีค่า 2009-08-01 แล้ว:

  • =WEEKDAY(A1) จะได้รับ 7
  • =TEXT(7, "dddd") จะได้รับ Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") จะได้รับ Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") จะได้รับ Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") จะได้รับด้วย Sunday, 1900-01-01

สองรายการสุดท้ายผิด: วันที่ 1 มกราคม 1900 เป็นวันจันทร์จริง ๆ
ดูเหมือนว่าหลายแหล่งที่จะยืนยันว่า:

ฉันพลาดอะไรไป เหตุใด Excel จึงทำเช่นนี้ผิด


1
ขอบคุณคำถามนี้ฉันได้รับคำตอบเล็กน้อยก่อนหน้าเพื่อให้ชัดเจนว่า 1/1/1900 ไม่ใช่วันอาทิตย์ แต่ Excel คิดว่าเป็น ความไม่ถูกต้องจะไม่เปลี่ยนเนื้อหาของคำตอบก่อนหน้าซึ่งนั่นคือการใช้หมายเลขวันทำงานเป็นพื้นฐานในการผลิตข้อความที่จัดรูปแบบให้ดูเหมือนว่าวันที่มีข้อบกพร่องและไม่จำเป็น
AdamV

คำตอบ:


40

ตามที่อธิบายไว้ใน Microsoft KB 214058 :

วันของสัปดาห์ก่อนวันที่ 1 มีนาคม 1900 ไม่ถูกต้องใน Excel

ข้อมูลมากกว่านี้

เมื่อระบบวันที่ใน Microsoft Excel ถูกสร้างขึ้นครั้งแรกมันถูกออกแบบมาเพื่อให้เข้ากันได้กับระบบวันที่ที่ใช้โดยโปรแกรมสเปรดชีตอื่น

อย่างไรก็ตามในระบบวันที่นี้ปี 1900 ถูกตีความอย่างไม่ถูกต้องว่าเป็นปีอธิกสุรทิน เนื่องจากไม่มีวันที่ 29 กุมภาพันธ์ ("วันอธิกสุรทิน") ในปี 1900 วันของสัปดาห์สำหรับวันใด ๆ ก่อนวันที่ 1 มีนาคม 1900 (วันหลัง "วันอธิกสุรทิน") จึงไม่คำนวณอย่างถูกต้อง

"โปรแกรมสเปรดชีตอื่น ๆ " อ้างถึงLotus 1-2-3ซึ่งค่อนข้างได้รับความนิยมตั้งแต่นั้นมาและสันนิษฐานว่าปี 1900 เป็นปีอธิกสุรทินอย่างไม่ถูกต้อง นี่คือคำอธิบายโดยละเอียดยิ่งขึ้นในKB 214326 :

Excel 2000 ถือว่าไม่ถูกต้องว่าปี 1900 เป็นปีอธิกสุรทิน

ข้อมูลมากกว่านี้

เมื่อโลตัส 1-2-3 เปิดตัวครั้งแรกโปรแกรมสันนิษฐานว่าปี 1900 เป็นปีอธิกสุรทินแม้ว่ามันจะไม่ใช่ปีอธิกสุรทิน สิ่งนี้ทำให้ง่ายขึ้นสำหรับโปรแกรมที่จะจัดการกับปีอธิกสุรทินและไม่ก่อให้เกิดอันตรายต่อการคำนวณวันที่เกือบทั้งหมดใน Lotus 1-2-3

เมื่อ Microsoft Multiplan และ Microsoft Excel ได้รับการปล่อยตัวพวกเขายังสันนิษฐานว่าปี 1900 เป็นปีอธิกสุรทิน สมมติฐานนี้อนุญาตให้ Microsoft Multiplan และ Microsoft Excel ใช้ระบบวันที่อนุกรมที่ใช้โดย Lotus 1-2-3 และให้ความเข้ากันได้กับ Lotus 1-2-3 มากขึ้น การรักษา 1900 เป็นปีอธิกสุรทินทำให้ผู้ใช้สามารถย้ายแผ่นงานจากโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งได้ง่ายขึ้น

แม้ว่าจะเป็นไปได้ในทางเทคนิคที่จะแก้ไขพฤติกรรมนี้เพื่อให้ Microsoft Excel รุ่นปัจจุบันไม่คิดว่า 1900 เป็นปีอธิกสุรทินข้อเสียของการทำเช่นนั้นมีมากกว่าข้อดี

หากพฤติกรรมนี้ได้รับการแก้ไขปัญหามากมายจะเกิดขึ้นรวมถึงสิ่งต่อไปนี้:

  • วันที่เกือบทั้งหมดในแผ่นงาน Microsoft Excel ปัจจุบันและเอกสารอื่น ๆ จะลดลงหนึ่งวัน การแก้ไขกะนี้จะใช้เวลาและความพยายามมากโดยเฉพาะในสูตรที่ใช้วันที่
  • บางฟังก์ชั่นเช่นฟังก์ชัน WEEKDAY จะคืนค่าที่ต่างกัน ซึ่งอาจทำให้สูตรในแผ่นงานทำงานผิดพลาด
  • การแก้ไขพฤติกรรมนี้จะทำลายความเข้ากันได้ของวันที่แบบอนุกรมระหว่าง Microsoft Excel และโปรแกรมอื่น ๆ ที่ใช้วันที่

หากพฤติกรรมยังคงไม่ถูกแก้ไขจะเกิดปัญหาเดียวเท่านั้น:

  • ฟังก์ชัน WEEKDAY ส่งคืนค่าที่ไม่ถูกต้องสำหรับวันที่ก่อน 1 มีนาคม 1900 เนื่องจากผู้ใช้ส่วนใหญ่ไม่ใช้วันที่ก่อนวันที่ 1 มีนาคม 1900 ปัญหานี้จึงเกิดขึ้นน้อยมาก

10
นี่คือเรื่องราวที่เกี่ยวข้องจาก Joel Spolsky ของ Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt

5
ดูเพิ่มเติม โปรแกรมเมอร์หลายคนคิดอย่างผิด ๆ ว่าการทำงานกับวันที่ / เวลานั้นง่ายมาก :)
BlueRaja - Danny Pflughoeft

3
nitpicK เชิงประวัติศาสตร์: เมื่อคุณพูด 1-2-3 ว่า "เป็นที่นิยมมาก" คุณหมายถึงมันเคยเป็นสเปรดชีตที่โดดเด่น
Isaac Rabinovitch

12

นี่คือเหตุผลที่โจเอลอธิบายตัวเอง: My BillG Review เป็นครั้งแรก

พื้นฐานใช้วันที่ 31 ธันวาคม 1899 เป็นยุคแทนที่จะเป็นวันที่ 1 มกราคม 1900 แต่ด้วยเหตุผลบางอย่างวันที่วันนี้เหมือนกันใน Excel เหมือนเดิม

ฮะ?

ฉันไปหานักพัฒนา Excel ที่อายุมากพอที่จะจำได้ว่าทำไม เอ็ดฟรายส์ดูเหมือนจะรู้คำตอบ

"โอ้" เขาบอกฉัน "ตรวจสอบ 28 กุมภาพันธ์ 1900"

"มันเป็น 59" ฉันพูด

"ลองวันที่ 1 มีนาคม"

"มัน 61!"

"เกิดอะไรขึ้นกับ 60?" เอ็ดถาม

"29 กุมภาพันธ์ 1900 เป็นปีอธิกสุรทิน! มันหารด้วย 4!"

“ เดาได้ดี แต่ไม่มีซิการ์” เอ็ดพูดและทิ้งให้ฉันสงสัยอยู่พักหนึ่ง

อุ่ย ฉันทำวิจัย ปีที่หารด้วย 100 จะไม่กระโดดปีเว้นแต่ว่าพวกมันหารด้วย 400

1900 ไม่ใช่ปีอธิกสุรทิน

"มันเป็นข้อผิดพลาดใน Excel!" ฉันอุทาน

“ ก็ไม่ได้จริงๆ” เอ็ดกล่าว "เราต้องทำอย่างนั้นเพราะเราต้องสามารถนำเข้าแผ่นงานของ Lotus 123"

"งั้นมันเป็นข้อผิดพลาดใน Lotus 123"

"ใช่ แต่อาจเป็นเจตนาได้โลตัสต้องพอดีกับ 640K นั่นไม่ใช่ความทรงจำมากมายถ้าคุณไม่สนใจ 1900 คุณสามารถคิดได้ว่าปีที่กำหนดนั้นเป็นปีอธิกสุรทินเพียงแค่ดูว่าสองบิตที่ถูกต้องที่สุดหรือไม่ เป็นศูนย์นั่นเร็วและง่ายจริง ๆ พวก Lotus คิดว่ามันไม่สำคัญว่าจะผิดในสองเดือนที่ผ่านมา


1
@JeroenWiertPluimers: จริงๆแล้วคำตอบของฉันกับลิงค์นี้ถูกลบโดยผู้ดูแลและฉันตัดสินใจที่จะขยายคำตอบของฉัน
Giorgi

2

วิธีหนึ่งในการแก้ไขปัญหานี้คือการเพิ่ม 400 ปีให้กับปีเพื่อทำงานในวันทำงานตามสูตร = WEEKDAY (DATE (A4 + 400, B4, C4), 1) ดังนั้นถ้า A4 = 1834 B4 = 12 C4 = 14 สิ่งนี้จะส่งคืน 1 (วันอาทิตย์) ซึ่งเหมือนกับวันที่ 14 ธันวาคม 2234 สิ่งนี้จะหยุดทำงานสำหรับวันที่ก่อนปี 1753 ปีหลังจากการเปลี่ยนปฏิทินเกรกอเรียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.