-
เริ่มมีการปล่อย JavaScript Temporal แล้ว
- การติดตั้งใช้งานอ็อบเจ็กต์ JavaScript Temporal แบบใหม่เริ่มถูกรวมเข้าไปในรุ่นทดลองของเบราว์เซอร์แล้ว นี่เป็นข่าวใหญ่สำหรับนักพัฒนาเว็บ และจะทำให้การจัดการวันที่และเวลาใน JavaScript ง่ายขึ้นและทันสมัยขึ้นอย่างมาก
- แอปพลิเคชันที่พึ่งพาการจัดตารางเวลา การทำงานหลายภาษา และข้อมูลที่ไวต่อเวลา จะสามารถใช้ความสามารถที่มีมาในตัวเพื่อจัดการวันที่ เวลา ช่วงเวลา และปฏิทินได้อย่างมีประสิทธิภาพ แม่นยำ และสม่ำเสมอ
- แม้ยังห่างไกลจากการรองรับข้ามเบราว์เซอร์แบบเสถียร และอาจยังมีการเปลี่ยนแปลงเมื่อการติดตั้งใช้งานพัฒนาต่อไป แต่ตอนนี้เราสามารถเริ่มดู Temporal ได้แล้ว รวมถึงเข้าใจว่าทำไมมันจึงสำคัญและแก้ปัญหาอะไรได้บ้าง
- มีเอกสาร Temporal บน MDN มากกว่า 270 หน้าที่เพิ่งเพิ่มเข้ามาในสัปดาห์นี้ พร้อมคำอธิบายและตัวอย่างอย่างละเอียด
-
JavaScript Temporal คืออะไร?
- เพื่อทำความเข้าใจ Temporal เราสามารถย้อนมาดูอ็อบเจ็กต์
Date ของ JavaScript ได้ เมื่อ JavaScript ถูกสร้างขึ้นในปี 1995 อ็อบเจ็กต์ Date ถูกคัดลอกมาจากการติดตั้งใช้งาน java.util.Date รุ่นแรกของ Java ที่มีข้อบกพร่อง
- แม้ Java จะเปลี่ยนการติดตั้งใช้งานนี้ตั้งแต่ปี 1997 แต่ JavaScript ยังคงติดอยู่กับ API เดิมมาเกือบ 30 ปี
- ปัญหาหลักของอ็อบเจ็กต์
Date ใน JavaScript คือรองรับเพียงเวลาท้องถิ่นของผู้ใช้และ UTC เท่านั้น โดยไม่มีการรองรับเขตเวลา นอกจากนี้พฤติกรรมการ parse ยังเชื่อถือได้ยากมาก และตัว Date เองก็แก้ไขค่าได้ จนอาจทำให้เกิดบั๊กที่ติดตามได้ยาก
- ปัญหาทั้งหมดนี้ทำให้การจัดการวันที่และเวลาใน JavaScript มีความซับซ้อนและเกิดบั๊กได้ง่าย นักพัฒนาส่วนใหญ่จึงพึ่งพาไลบรารีอย่าง Moment.js และ date-fns เพื่อจัดการวันที่และเวลาในแอปพลิเคชันได้ดีขึ้น
- Temporal ถูกออกแบบมาเพื่อแทนที่อ็อบเจ็กต์
Date อย่างสมบูรณ์ ทำให้การจัดการวันที่และเวลามีความน่าเชื่อถือและคาดเดาได้มากขึ้น Temporal รองรับการแสดงเขตเวลาและปฏิทิน และเพิ่มเมธอดในตัวจำนวนมากสำหรับการแปลง การเปรียบเทียบ การคำนวณ การฟอร์แมต และอื่น ๆ
-
แนวคิดหลัก
- แนวคิดสำคัญใน Temporal คือ instant (จุดเวลาที่ไม่ซ้ำกันในประวัติศาสตร์), เวลาแบบนาฬิกาบนผนัง (เวลาท้องถิ่น) และ duration โดย API มีโครงสร้างสำหรับจัดการแนวคิดเหล่านี้ดังนี้:
- ช่วงเวลา:
Temporal.Duration ความแตกต่างระหว่างสองจุดเวลา
- จุดเวลา:
- จุดเวลาที่ไม่ซ้ำกัน:
- ในรูป timestamp:
Temporal.Instant
- วันที่-เวลาพร้อมเขตเวลา:
Temporal.ZonedDateTime
- วันที่/เวลาที่ไม่ขึ้นกับเขตเวลา ("Plain"):
- วันที่และเวลาครบถ้วน:
Temporal.PlainDateTime
- วันที่อย่างเดียว:
Temporal.PlainDate
- ปีและเดือน:
Temporal.PlainYearMonth
- เดือนและวัน:
Temporal.PlainMonthDay
- เวลาอย่างเดียว:
Temporal.PlainTime
- เวลาปัจจุบัน: ใช้
Temporal.now เพื่อรับเวลาปัจจุบันในรูปอินสแตนซ์ของคลาสต่าง ๆ หรือในรูปแบบที่กำหนด
-
ตัวอย่างของ Temporal
- การใช้งานพื้นฐานที่สุดอย่างหนึ่งของ Temporal คือการรับวันที่และเวลาปัจจุบันเป็นสตริง ISO ตอนนี้หลายเมธอดสามารถระบุเขตเวลาได้แล้ว ซึ่งช่วยให้ไม่ต้องคำนวณที่ซับซ้อนด้วยตัวเอง
- การทำงานกับปฏิทินหลากหลายแบบก็ง่ายขึ้นเช่นกัน ทำให้สามารถสร้างวันที่ในระบบปฏิทินนอกเหนือจากเกรกอเรียนได้ เช่น ฮีบรู จีน และอิสลาม
- การทำงานกับ Unix timestamp เป็นกรณีการใช้งานที่พบบ่อยมาก เพราะหลายระบบ เช่น API และฐานข้อมูล ใช้รูปแบบนี้ในการแทนเวลา
- เมธอด
compare() ช่วยให้สามารถจัดเรียงช่วงเวลาได้อย่างสวยงามและมีประสิทธิภาพ
-
การลองใช้ Temporal และการรองรับของเบราว์เซอร์
- การรองรับเริ่มค่อย ๆ ถูกเพิ่มเข้าไปในรุ่นทดลองของเบราว์เซอร์ โดยปัจจุบัน Firefox มีการติดตั้งใช้งานที่พัฒนามากที่สุด
- ใน Firefox นั้น Temporal ถูกฝังมาใน Nightly ภายใต้การตั้งค่า
javascript.options.experimental.temporal
- เมื่อเริ่มมีการนำการติดตั้งใช้งานแบบทดลองเข้ามา นี่จึงเป็นช่วงเวลาที่ดีในการลองใช้ Temporal และทำความคุ้นเคยกับแนวทางสมัยใหม่ในการจัดการวันที่และเวลาใน JavaScript
-
คำขอบคุณ
- ขอขอบคุณ Eric Meyer สำหรับงานในหัวข้อนี้ เวลาผ่านมาราว 4 ปีแล้วนับตั้งแต่ Eric ได้บันทึกข้อมูลความเข้ากันได้ของเบราว์เซอร์และจัดโครงสร้างเอกสารไว้ในฟอร์กของ mdn/content
- Joshua Chen รับช่วงต่อจาก Eric และเตรียมพูลรีเควสต์สำหรับเอกสาร MDN
- ขอขอบคุณ André Bargull สำหรับงานเกี่ยวกับการติดตั้งใช้งาน Temporal ใน Firefox
1 ความคิดเห็น
ความเห็นบน Hacker News
Temporal มีประโยชน์ในการแก้ปัญหาของ API
Date()เดิม โดยได้รับแรงบันดาลใจจากไลบรารีจัดการเวลาคุณภาพสูงอย่าง chrono ของ Rust และ Joda Time ของ Java ทำให้มี API ที่ใช้งานสะดวกสามารถแปลงเขตเวลาได้ด้วย
Temporal.ZonedDateTime.prototype.withTimeZone()Temporal.Durationไม่มีฟังก์ชันformatแบบกำหนดเองให้ใช้ข้อเสนอ Temporal นั้นดี แต่ก็น่าเสียดายที่ใช้ความเท่ากันแบบอ้างอิงเมื่อเปรียบเทียบ
ใน TC39 มีหลายฟีเจอร์ที่กำลังพัฒนาอยู่ และหวังว่า Temporal จะออกมาให้ใช้ได้เร็ว ๆ
มีความสงสัยเกี่ยวกับวิธีอัปเดตข้อมูลเขตเวลาของ Temporal
มีข้อเสนอว่าควรเพิ่มอีเวนต์เมื่อมีการเปลี่ยนเขตเวลา
ใช้ชื่อ Temporal เพื่อหลีกเลี่ยงการชนกับอ็อบเจ็กต์เวลาทั่วไป แต่ตอนแรกอาจทำให้เข้าใจผิดว่าเกี่ยวกับการควบคุม garbage collection
คลาส Carbon ของ PHP สืบทอดจาก DateTime และอธิบายปัญหาของการทำงานกับไทม์สแตมป์แบบเปลี่ยนแปลงได้
มีบทความและการถกเถียงหลากหลายเกี่ยวกับ JavaScript Temporal