2 คะแนน โดย GN⁺ 2025-01-31 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เริ่มมีการปล่อย 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 ความคิดเห็น

 
GN⁺ 2025-01-31
ความเห็นบน Hacker News
  • Temporal มีประโยชน์ในการแก้ปัญหาของ API Date() เดิม โดยได้รับแรงบันดาลใจจากไลบรารีจัดการเวลาคุณภาพสูงอย่าง chrono ของ Rust และ Joda Time ของ Java ทำให้มี API ที่ใช้งานสะดวก

    • เวลาเป็นเรื่องซับซ้อน และ Temporal จัดการโดยแยกเป็นเวลาแบบ naive, instant และ zoned time
    • เมื่อต้องเพิ่มหนึ่งวันให้ไทม์สแตมป์ จำเป็นต้องตัดสินใจก่อนว่าเป็นเวลาแบบ local ในเขตเวลาหนึ่งหรือไม่ มิฉะนั้นอาจเกิดบั๊กเมื่อมี DST หรือมีการเปลี่ยนเขตเวลา
    • ยังช่วยแก้ปัญหาการซีเรียลไลซ์ระหว่างไทม์สแตมป์แบบ "fixed offset" กับไทม์สแตมป์ของเขตเวลาที่ระบุด้วย
  • สามารถแปลงเขตเวลาได้ด้วย Temporal.ZonedDateTime.prototype.withTimeZone()

    • การแปลงเขตเวลาและการจัดการ duration เป็นความสามารถสำคัญที่ไลบรารีควรมี และ Temporal ก็รองรับสิ่งนี้
    • อย่างไรก็ตาม Temporal.Duration ไม่มีฟังก์ชัน format แบบกำหนดเองให้ใช้
  • ข้อเสนอ Temporal นั้นดี แต่ก็น่าเสียดายที่ใช้ความเท่ากันแบบอ้างอิงเมื่อเปรียบเทียบ

    • ทำให้ไม่สามารถใช้วัตถุเป็นคีย์ของ Map หรือเก็บรวมใน Set ได้
  • ใน TC39 มีหลายฟีเจอร์ที่กำลังพัฒนาอยู่ และหวังว่า Temporal จะออกมาให้ใช้ได้เร็ว ๆ

    • เบราว์เซอร์หลัก ๆ ต้องใช้ความพยายามในการพัฒนาเพื่อรองรับฟีเจอร์ใหม่
  • มีความสงสัยเกี่ยวกับวิธีอัปเดตข้อมูลเขตเวลาของ Temporal

    • หากผู้ใช้ไม่อัปเดตเบราว์เซอร์ ก็อาจเห็นเวลาไม่ถูกต้องได้
  • มีข้อเสนอว่าควรเพิ่มอีเวนต์เมื่อมีการเปลี่ยนเขตเวลา

    • หลายคนเดินทางข้ามเขตเวลาทุกวัน
  • ใช้ชื่อ Temporal เพื่อหลีกเลี่ยงการชนกับอ็อบเจ็กต์เวลาทั่วไป แต่ตอนแรกอาจทำให้เข้าใจผิดว่าเกี่ยวกับการควบคุม garbage collection

  • คลาส Carbon ของ PHP สืบทอดจาก DateTime และอธิบายปัญหาของการทำงานกับไทม์สแตมป์แบบเปลี่ยนแปลงได้

    • แนะนำให้ใช้ CarbonImmutable เพื่อให้คืนอินสแตนซ์ใหม่เสมอ
    • มีข้อเสนอวิธีนำเข้า CarbonImmutable และ Carbon แบบ alias ใน Laravel
  • มีบทความและการถกเถียงหลากหลายเกี่ยวกับ JavaScript Temporal