- Whenever เป็นไลบรารีที่พัฒนาต่อยอดจาก
datetime ของ Python เพื่อให้มี ความปลอดภัยด้าน DST และ ความปลอดภัยด้านชนิดข้อมูล
- ใช้งานได้ทั้งด้วย Rust และ Python ล้วน พร้อม ประสิทธิภาพ ที่ยอดเยี่ยม
- เหนือกว่าไลบรารีมาตรฐานของ Python รวมถึง Arrow และ Pendulum ในด้าน การจัดการ DST และ ความปลอดภัยด้านชนิดข้อมูล
- รองรับ ความละเอียดระดับนาโนวินาที และ การปรับปรุง GIL ล่าสุด พร้อมเพิ่มประสิทธิภาพผ่าน ส่วนขยาย Rust
- เผยแพร่ภายใต้ MIT License และยังคงพัฒนาอย่างต่อเนื่องผ่าน ข้อเสนอแนะ
แนะนำ Whenever
- Whenever เป็นไลบรารีที่สร้างขึ้นเพื่อแก้ข้อจำกัดของโมดูล
datetime ใน Python
- มอบทั้ง ความปลอดภัยด้าน DST และ ความปลอดภัยด้านชนิดข้อมูล เพื่อเพิ่มความถูกต้องของโค้ด
- พัฒนาด้วย Rust และ Python ล้วน และมีประสิทธิภาพสูง
ข้อจำกัดของไลบรารีมาตรฐาน
datetime ของ Python ไม่ได้คำนึงถึง DST เสมอไป
- ใน ระบบชนิดข้อมูล ไม่สามารถแยก
datetime แบบ naive และ aware ได้
เปรียบเทียบกับไลบรารีอื่น
- Arrow มี API ที่ใช้งานง่าย แต่ยังไม่สามารถแก้ปัญหาหลักได้
- Pendulum แก้ปัญหา DST ได้บางส่วน แต่มีประสิทธิภาพลดลงและขาดการดูแลรักษาอย่างต่อเนื่อง
จุดเด่นของ Whenever
- มีทั้ง การคำนวณเชิงเวลาแบบปลอดภัยต่อ DST และ API ที่ปลอดภัยด้านชนิดข้อมูล
- ประสิทธิภาพ สูง และดีขึ้นอีกผ่าน ส่วนขยาย Rust
- รองรับ ความละเอียดระดับนาโนวินาที และ การปรับปรุง GIL ล่าสุด
เริ่มต้นใช้งานอย่างรวดเร็ว
- มีชนิดข้อมูลแบบระบุชัดเจน เช่น
Instant, ZonedDateTime, LocalDateTime
- รองรับ การคำนวณเชิงเวลาแบบปลอดภัยต่อ DST และ การแปลงค่าแบบชัดเจน
- รองรับการฟอร์แมตและพาร์สในรูปแบบ ISO8601, RFC3339, RFC2822
โรดแมป
- เวอร์ชัน 0.x: ทำให้ฟีเจอร์ครบถ้วนเทียบเท่าและปรับปรุง API
- เวอร์ชัน 1.0: ทำให้ API มีเสถียรภาพและรองรับความเข้ากันได้ย้อนหลัง
ข้อจำกัด
- รองรับปฏิทินเกรกอเรียนตั้งแต่ ค.ศ. 1 ถึง 9999
- รองรับ ออฟเซ็ตเขตเวลา ที่สอดคล้องกับ IANA TZ DB
- ไม่รองรับ วินาทีอธิกสุรทิน
นโยบายการจัดการเวอร์ชันและความเข้ากันได้
- Whenever ใช้ Semantic Versioning
- ก่อนถึงเวอร์ชัน 1.0 API อาจมีการเปลี่ยนแปลงได้
ใบอนุญาต
- เผยแพร่ภายใต้ MIT License และ dependency ฝั่ง Rust ใช้ใบอนุญาตแบบอนุญาตที่คล้ายกัน
คำขอบคุณ
- ได้รับแรงบันดาลใจจากโปรเจ็กต์ Temporal, Noda Time, Joda Time
- อ้างอิงกราฟเปรียบเทียบ benchmark จากโปรเจ็กต์ Ruff
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
datetimeกับวันที่จะเกิดข้อผิดพลาด ไม่นานมานี้ฉันเจอปัญหานี้จนลำบากในที่ทำงานdatetimeของไลบรารีมาตรฐานมาแล้ว แต่สุดท้ายเลือก Whenever เพราะดูเหมาะกับการจัดการdatetimeจริงมากกว่า และเหมือนจะมีการดูแลรักษาอย่างต่อเนื่องมากกว่า รู้สึกว่าไลบรารีอื่นมักพลาดเคสขอบอยู่เสมอ ส่วน Pendulum ดูเหมือนจะฝังลึกอยู่ใน API มากกว่าrequirements.txtไม่ได้datetimeเข้าไป น่าจะเป็นไลบรารีที่ถูกใช้จัดการวันที่มากกว่าไลบรารีอื่นเสียอีกdatetimeเป็นอ็อบเจ็กต์อายุสั้น คงไม่อยากมีอ็อบเจ็กต์datetimeหลายพันตัวอยู่ในโค้ดเบส เกือบทุกกรณี UTC ก็เพียงพอแล้ว เวลาอยากกรอง/จัดบักเก็ต/สรุปผลตามช่วง ก็ใช้datetimeที่มีtzเพื่อกำหนดเกณฑ์การกรอง/จัดบักเก็ต/สรุปผล แล้วแปลงเป็น UTC เพื่อกลับไปเทียบแบบintต่อ กรณีส่วนใหญ่ที่ Whenever จัดการน่าจะเป็นตอนที่datetimeเป็นอ็อบเจ็กต์ระยะยาว ซึ่งฉันไม่เคยรู้สึกว่าต้องการแบบนั้นเลย ฉันใช้มันเพื่อรับค่าtzจากฝั่งไคลเอนต์ แล้วแปลงเป็น UTC ทันทีที่มาถึง ถ้าจำเป็นต้องใช้tzจริง ๆ ก็เก็บแยกต่างหาก ซึ่งเกิดขึ้นไม่บ่อย (เช่น ปฏิทินควรเก็บtzแต่คงไม่จำเป็นต้องเก็บคู่กับ UTC ทุกค่า แค่อาจเก็บในระดับผู้ใช้ก็พอ อีกตัวอย่างคือการจัดตารางพนักงานที่ 8am-4pm หรือ 8pm-4am อาจมีความหมายต่างกันตามสถานที่ ซึ่งนั่นไม่ใช่datetimeอีกต่อไป แต่เป็นเวลาในเขตเวลานั้น)datetimeที่ดีกว่าในโปรเจกต์ก็ไม่ต้องย้อนกลับไปใช้datetimeอีก ใช้ได้แม้ในสภาพแวดล้อมที่ไม่มี Rust toolchain หรือมีปัญหากับมัน Kudospedanticก็มีคนใช้ไปแล้ว Timely, precise, punctual, meticulous, ahorita, pronto อะไรทำนองนั้น ฉันชอบชื่อที่เกี่ยวกับเวลา สุดท้ายนี้ ไม่มีลิงก์ไหนในนี้พูดถึงความไม่เปลี่ยนรูปเลย ทั้งที่มันควรถูกพูดถึงไว้บนสุด