ควรทดสอบวันที่ไหน?
การทดสอบวันที่ครึ่งหนึ่งคือการเลื่อนนาฬิกา อีกครึ่งหนึ่งคือการรู้ว่าจะเลื่อนไปที่ไหน เครื่องคิดเลขออนไลน์บอกคุณได้ว่าเก้าสิบวันนับจากวันนี้คือวันอะไร แต่จะไม่บอกว่าวันนั้นเป็นวันหยุดธนาคาร หรือเป็นวันสุดท้ายของไตรมาส
04/08/2008 เข้าไป แล้วแสดงทั้งสองการอ่านแทนที่จะเดาเพียงแบบเดียววันทำการ พร้อมวันหยุดจริง
“สิบวันทำการข้างหน้า” ไม่ใช่เลขคณิต - ขึ้นอยู่กับว่าคุณนับในปฏิทินของประเทศใด วันเริ่มต้นเดียวกัน สิบวันเท่ากัน ได้สองคำตอบที่ต่างกัน:
$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar us-banking result: 2027-09-16T00:00:00 $ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar pl result: 2027-09-15T00:00:00
ต่างกันหนึ่งวัน และเครื่องคิดเลขจะบอกเหตุผลถ้าคุณถามถึงวันที่อยู่ตรงกลาง:
$ chrono calc --base 2027-09-06T00:00:00 --calendar us-banking metadata: weekday Monday business day no (us-banking) holiday Labor Day what this date lands on: public holiday (weekend and holiday marks follow the us-banking calendar)
สหรัฐอเมริกาและโปแลนด์มาเป็นปฏิทินอ้างอิง โดยเลือกเพราะทั้งสองรวมกันครอบคลุมกฎทุกประเภท ได้แก่ วันที่ตายตัว วันธรรมดาที่ n ของเดือน วันที่คำนวณจากวันอีสเตอร์ และกฎแบบอเมริกันที่วันหยุดซึ่งตรงกับวันเสาร์จะถือเป็นวันศุกร์ก่อนหน้า การเพิ่มประเทศหนึ่งคือการเพิ่มไฟล์ข้อมูล ไม่ใช่การแก้โค้ด
ทุกรูปแบบพร้อมกัน
แอปที่ทดสอบต้องการวันที่ในรูปแบบที่มันคาดหวัง แทนที่จะให้คุณแปลงเอง เครื่องคิดเลขพิมพ์ให้ทั้งหมด - และมีมาสก์กำหนดเองสำหรับรูปแบบที่ไม่เข้ากับมาตรฐานใดเลย
$ chrono calc --preset year-2038 --zone +00:00 Chrono Mock - date calculator preset: year-2038 - 2038 boundary explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)? result: 2038-01-19T03:14:07 formats: ISO date 2038-01-19 ISO datetime 2038-01-19T03:14:07+00:00 US 01/19/2038 PL 19.01.2038 epoch (s) 2147483647 epoch (ms) 2147483647000 FILETIME 137919572470000000 RFC 1123 Tue, 19 Jan 2038 03:14:07 GMT ... what this date lands on: at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)
ค่าเอพอกนั้นไม่ใช่เรื่องบังเอิญ - 2147483647 คือจำนวนที่ใหญ่ที่สุดที่จำนวนเต็มแบบมีเครื่องหมาย 32 บิตเก็บได้พอดี ซึ่งเป็นเหตุผลทั้งหมดที่วันที่นี้สำคัญ
อ่านวันที่ย้อนกลับ
ทิศทางตรงข้ามก็มีประโยชน์พอกัน: วางวันที่จากล็อกแล้วดูว่ามันคืออะไร เมื่อรูปแบบกำกวม - และ 04/08 กำกวมในครึ่งหนึ่งของโลก - จะแสดงทั้งสองการอ่านแทนที่จะเดาแบบเดียว เพราะการเดาคือที่มาของรายงานบั๊กเดิม
$ chrono calc --analyze 04/08/2027 Chrono Mock - date analysis input: 04/08/2027 (ambiguous - month/day order differs by locale) US MM/DD/YYYY: 2027-04-08 (Thursday) PL DD/MM/YYYY: 2027-08-04 (Wednesday)
ห่างกันสี่เดือน และตรงกับวันในสัปดาห์ที่ต่างกัน วันที่แบบ ISO ไม่กำกวมและถูกอ่านเป็นเช่นนั้น ส่วนสิ่งที่ไม่ใช่วันที่เลยจะถูกปฏิเสธแทนที่จะเดา
สร้างจากสเตป ไม่ใช่จากประโยค
ช่วงเวลาคือจุดเริ่มต้นบวกสเตป และผลลัพธ์ระหว่างทางจะแสดงหลังทุกสเตป นิพจน์ที่ให้คำตอบน่าแปลกใจจึงบอกคุณว่าเลี้ยวผิดตรงไหน สเตปมีห้าแบบ: เลื่อนด้วยหน่วย ตั้งเวลาของวัน กระโดดไปยังขอบเขตของช่วงเวลา ย้ายไปวันทำการที่ใกล้ที่สุด และแสดงใหม่ในเขตเวลาอื่น
# วินาทีสุดท้ายก่อนขึ้นปีใหม่ chrono calc --base today --snap eoy # เก้าสิบวันทำการข้างหน้า ตามปฏิทินธนาคารอเมริกัน chrono calc --base today --shift +90bd --calendar us-banking # ถอยหลังสิบแปดปีกับอีกหนึ่งวัน สำหรับตรวจอายุ chrono calc --base today --shift -18y --shift -1d
วันที่ที่คำนวณได้ทุกวันส่งเข้าเซสชันแทนที่เวลาได้โดยตรง และ --json ส่งออกผลลัพธ์เดียวกันในรูปแบบสำหรับเครื่อง วันที่ที่ควรทดสอบ →