JavaScript Temporal กำลังมา
(developer.mozilla.org)- อ็อบเจ็กต์ Temporal ใหม่ของ JavaScript เริ่มถูกนำเข้าไปในรุ่นทดลองของเบราว์เซอร์แล้ว เป็นการเปลี่ยนแปลงที่มุ่งจัดการวันที่ เวลา ระยะเวลา และปฏิทินด้วย API ในตัวให้แม่นยำและสม่ำเสมอยิ่งขึ้น
Dateเดิมทำให้ การจัดการเขตเวลาและการดีบัก เป็นเรื่องยาก เนื่องจากโครงสร้างที่เน้นเวลาท้องถิ่นของผู้ใช้กับ UTC, การ parse ที่ไม่เสถียร และพฤติกรรมแบบ mutable- Temporal แยก จุดเวลา เวลาในพื้นที่ และระยะเวลา ออกจากกันด้วย
Temporal.Instant,Temporal.ZonedDateTime,Temporal.PlainDateTime,Temporal.Duration,Temporal.Nowเป็นต้น และมีเมธอดยูทิลิตีกว่า 200 รายการ - ยังต้องใช้เวลาอีกระยะกว่าจะรองรับข้ามเบราว์เซอร์อย่างเสถียร โดยใน Firefox Nightly สามารถทดลอง Temporal ได้หลังเปิดการตั้งค่า
javascript.options.experimental.temporal - สัปดาห์นี้ MDN เพิ่มเอกสาร Temporal มากกว่า 270 หน้า และในหน้าเอกสาร TC39 ที่มี
@js-temporal/polyfillสามารถรันตัวอย่างได้โดยไม่ต้องเปลี่ยน flag
ข้อจำกัดเก่าแก่ของ JavaScript Date
- ตอนที่ JavaScript ถูกสร้างขึ้นในปี 1995 อ็อบเจ็กต์
Dateได้คัดลอกการใช้งานjava.util.Dateรุ่นแรกของ Java มา และแม้ Java จะเปลี่ยนแทนที่สิ่งนี้ในปี 1997 แต่ JavaScript ยังคงใช้ API เดิมมาเกือบ 30 ปี - ปัญหาใหญ่ที่สุดคือ การรองรับเขตเวลาที่ไม่เพียงพอ และพฤติกรรมการ parse ที่ไม่เสถียร
- รองรับเฉพาะเวลาท้องถิ่นของผู้ใช้และ UTC
- ตัว
Dateเองเป็น mutable จึงอาจสร้างบั๊กที่ติดตามได้ยาก - การคำนวณที่ข้าม Daylight Saving Time (DST) และการเปลี่ยนแปลงปฏิทินในอดีตก็จัดการได้ยาก
- ด้วยข้อจำกัดเหล่านี้ นักพัฒนาจำนวนมากจึงพึ่งพาไลบรารีเฉพาะทางอย่าง Moment.js หรือ date-fns เพื่อจัดการวันที่และเวลาในแอปพลิเคชัน
โมเดลวันที่และเวลาที่ Temporal จะเปลี่ยนแปลง
- Temporal ถูกออกแบบให้เป็น ตัวแทนทั้งหมด ของอ็อบเจ็กต์
Dateโดยมีเป้าหมายให้การจัดการวันที่และเวลาน่าเชื่อถือและคาดเดาได้มากขึ้น - รองรับการแสดงเขตเวลาและปฏิทิน พร้อมมีเมธอดในตัวสำหรับการแปลง การเปรียบเทียบ การคำนวณ และการจัดรูปแบบ
- พื้นผิวของ API มีเมธอดยูทิลิตีกว่า 200 รายการ และมีการเพิ่มคำอธิบายกับตัวอย่างใน เอกสาร Temporal ของ MDN แล้ว
ประเภทหลักของ Temporal
- Temporal แยก จุดเวลาเฉพาะตัว เวลาแบบนาฬิกาติดผนังในพื้นที่ และระยะเวลา ออกเป็นคนละ type
- โครงสร้างหลักมีดังนี้
Temporal.Duration: ความต่างระหว่างสองจุดเวลาTemporal.Instant: จุดเวลาเฉพาะตัวที่แสดงเป็น timestampTemporal.ZonedDateTime: วันที่และเวลาที่มีเขตเวลารวมอยู่Temporal.PlainDateTime: วันที่และเวลาแบบเต็มที่ไม่มีเขตเวลาTemporal.PlainDate: แสดงเฉพาะวันที่Temporal.PlainYearMonth: ปีและเดือนTemporal.PlainMonthDay: เดือนและวันTemporal.PlainTime: แสดงเฉพาะเวลา
Temporal.Now: API สำหรับดึงเวลาปัจจุบันเป็นอินสแตนซ์ของคลาสต่าง ๆ หรือในรูปแบบเฉพาะ
วิธีใช้งานผ่านตัวอย่าง
- สามารถดึงวันที่และเวลาปัจจุบันเป็นสตริง ISO ได้ และส่ง เขตเวลา ให้กับหลายเมธอดได้
Temporal.Now.plainDateTimeISO()คืนค่าวันที่และเวลาปัจจุบันของเขตเวลาระบบTemporal.Now.plainDateTimeISO("America/New_York")คืนค่าวันที่และเวลาปัจจุบันของเขตเวลา New York
- ยังจัดการปฏิทินนอกเหนือจาก Gregorian ได้ จึงสามารถสร้างวันที่ในระบบปฏิทินอย่าง Hebrew, Chinese และ Islamic ได้
- คำนวณ Chinese New Year ถัดไปโดยใช้วันที่ 1 ของ
M01ในปฏิทิน Chinese - ในเอาต์พุตตัวอย่าง ณ เวลาที่เขียน Chinese New Year ถัดไปคือ
1/29/2025
- คำนวณ Chinese New Year ถัดไปโดยใช้วันที่ 1 ของ
- สามารถแปลง timestamp แบบมิลลิวินาทีจาก Unix Epoch เป็นจุดเวลาด้วย
Temporal.Instant.fromEpochMilliseconds()แล้วเปรียบเทียบกับTemporal.Now.instant()เพื่อคำนวณเวลาที่เหลือได้- สำหรับ timestamp ตัวอย่าง
1851222399924คำนวณเวลาจากปัจจุบันด้วยsmallestUnit: "hour" - เอาต์พุตของ
@js-temporal/polyfillคือ31,600 hrส่วนเอาต์พุตของ Firefox Nightly คือPT31600H
- สำหรับ timestamp ตัวอย่าง
toLocaleStringในการใช้งานของ Firefox ปัจจุบันยังไม่พิมพ์ สตริงที่ไวต่อ locale- พฤติกรรมนี้ใกล้เคียงกับการตัดสินใจด้านการออกแบบมากกว่าข้อจำกัดทางเทคนิค และตัว duration เองยังสามารถจัดรูปแบบได้
- polyfill กับการใช้งานของ Firefox อาจมาบรรจบกันในภายหลัง
- เมธอด
compare()สามารถนำไปใช้กับการเรียงลำดับ array ได้- ใช้
durations.sort(Temporal.Duration.compare)แล้วจะเรียงเป็นPT1H,PT1H30M,PT1H45M,PT2H
- ใช้
การรองรับของเบราว์เซอร์และวิธีทดลอง
- การรองรับ Temporal เริ่มค่อย ๆ ถูกใส่ในรุ่นทดลองของเบราว์เซอร์แล้ว และตอนนี้การใช้งานของ Firefox ดูจะสมบูรณ์ที่สุด
- ใน Firefox มีการ build Temporal ไว้หลังการตั้งค่า
javascript.options.experimental.temporalใน เวอร์ชัน Nightly - issue หลักของเบราว์เซอร์สำหรับติดตามการใช้งานมีดังนี้
- Firefox: Build temporal in Nightly by default
- Safari: [JSC] Implement Temporal
- Chrome: Implement the Temporal proposal
- สามารถตรวจสอบสถานะความเข้ากันได้ทั้งหมดได้ที่ ส่วน Browser Compatibility ของอ็อบเจ็กต์ Temporal บน MDN
- เอกสาร TC39 Temporal มี
@js-temporal/polyfillทำให้สามารถรันตัวอย่างในคอนโซล Developer Tools ได้จากทุกเบราว์เซอร์ โดยไม่ต้องเปลี่ยน flag หรือการตั้งค่าใด ๆ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Temporal ยอดเยี่ยมมาก ใช้งานในโปรดักชันผ่าน polyfill มาพักหนึ่งแล้ว และช่วยแก้ปัญหาหลายอย่างที่เคยเจอกับ API
Date()เดิมให้ความรู้สึกว่าได้แรงบันดาลใจจากไลบรารีจัดการเวลาที่ดีอย่าง
chronoของ Rust และ Joda Time ของ Java แล้วนำมารวมเป็น API ที่ใช้งานสะดวกมันซับซ้อนขึ้นเล็กน้อย เพราะแยกเวลาแบบล้วน ๆ, จุดเวลา, และเวลาที่รวมเขตเวลาออกจากกัน แต่เวลาเองก็ซับซ้อนอยู่แล้ว ดังนั้นนักพัฒนาจึงต้องเผชิญกับความซับซ้อนนั้น
แม้แต่งานอย่าง “เพิ่มหนึ่งวันให้ timestamp นี้” ก็ต้องตัดสินใจให้ชัดว่าทำโดยอิงเขตเวลาใด ไม่เช่นนั้นจะเหลือบั๊กจาก เวลาออมแสง การเปลี่ยนเขตเวลาของผู้ใช้ หรือความต่างของเขตเวลาบนเซิร์ฟเวอร์
ยังช่วยแก้ความต่างในการ serialize ระหว่าง timestamp ที่มี offset คงที่ (
2025-01-01T00:00+02:00) กับเขตเวลาเฉพาะ (Europe/Paris) ด้วยchronoไว้ด้วย: https://docs.rs/jiff/latest/jiff/_documentation/comparison/i...โดยส่วนตัวแล้วผมไม่คิดว่า Temporal ได้แรงบันดาลใจจาก
chronoของ Rust มากนัก น่าจะได้รับอิทธิพลจาก Joda หรือjava.timeในปัจจุบัน รวมถึงไลบรารีวันที่·เวลาฝั่ง JavaScript อย่าง date-fns หรือ Moment.js มากกว่าพวกเขาไม่อยากไปค้นว่า
Europe/Parisหมายถึงพื้นที่กว้างในฝรั่งเศสหรือแค่ปารีส และรู้สึกรำคาญเหมือนกำลังบอกว่าตัวเองอาศัยอยู่ในปารีสตอนกำหนดเวลาอีเวนต์ของชุมชนออนไลน์ เรื่องนี้เจ็บปวดมาก ผู้คนอยากใช้ offset คงที่ และโอเคกับคำอย่าง
CET/CESTแต่ไม่ชอบอะไรแบบEurope/yourexactcoordinatesจริง ๆ แล้วก็รู้ว่าเขตเวลาส่วนใหญ่ครอบคลุมพื้นที่ค่อนข้างกว้าง แต่มีคนจำนวนมากที่ใส่ใจความเป็นส่วนตัว ทว่าก็ไม่คิดจะค้นหาความต่างระหว่าง “เวลา” กับ “เขตเวลา”
chronoกับ Joda Time เป็นของคนละยุคกัน ตอน Rust 1.0 ออกมา Java ก็มีแนวทางนี้ในไลบรารีมาตรฐานอย่าง java.time อยู่แล้ว และไม่จำเป็นต้องใช้ไลบรารี third-party สำหรับงานนี้ใช้เวลาพอสมควรกว่าจะหาเจอในเอกสารว่า Temporal.ZonedDateTime.prototype.withTimeZone() ใช้แปลงจากเขตเวลาหนึ่งไปยังอีกเขตเวลาหนึ่งได้: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
ถ้านำค่าที่สร้างด้วย
Temporal.ZonedDateTime.from("2021-08-01T12:00[America/New_York]")ไปใส่ในwithTimeZone("Europe/Paris")จะได้2021-08-01T18:00:00+02:00[Europe/Paris]การแปลงเขตเวลาและการจัดการช่วงเวลาเป็นฟีเจอร์หลักที่ไลบรารีจำเป็นต้องรองรับ และดีที่ Temporal จัดการได้ทั้งสองอย่าง อย่างไรก็ตาม ดูเหมือนว่า
Temporal.Durationจะไม่มีฟังก์ชันformatแบบกำหนดเองเพื่อสร้างผลลัพธ์อย่าง1h03mเช่นduration.format('H\hmm\m')1 yr,3 hours,3m: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...เคยมีการ implement บางส่วนไว้ในไลบรารี icu4x
ตอนนี้ใน TC39 มีข้อเสนอหลายอย่างที่กำลังสุกงอม และ Temporal ก็เป็นหนึ่งในสิ่งที่อยากให้เปิดตัวเร็ว ๆ
เข้าใจดีว่าการที่เบราว์เซอร์หลัก ๆ จะรองรับฟีเจอร์ใหม่ได้นั้นต้องอาศัยแรงพัฒนาจากวิศวกรของ v8, JSC และ SpiderMonkey จึงรู้สึกขอบคุณคนที่ทำให้เกิดความคืบหน้าจริง ๆ
ในฐานะคนใจร้อน ก็อยากเชียร์ว่า “Records กับ Tuples ก็รีบทำให้หน่อย! สงครามไวยากรณ์ Pipe ข้ามไปก็ได้!”
เท่าที่เข้าใจ ผู้ผลิตเบราว์เซอร์คัดค้านค่อนข้างหนักอยู่แล้วกับการเพิ่ม primitive type ใหม่ในเวลานี้ ส่วนความยากที่ว่าความเท่ากันควรทำงานอย่างไร มีอธิบายไว้ในเธรดนี้: https://github.com/tc39/proposal-record-tuple/issues/387
ตอนแรกไม่ได้คาดว่า BigInt จะถูกใช้เยอะขนาดนี้ แต่ในความเป็นจริงก็ยังเจอสถานการณ์ที่ต้องการคอลเลกชันที่มี structural equality อยู่เรื่อย ๆ เลยรู้สึกเสียดาย
เข้าใจว่าการคัดค้านการเพิ่ม primitive type ใหม่ส่งผลถึง pattern matching ด้วย แต่ไม่ค่อยรู้เหตุผล และติดตามข้อเสนอนั้นน้อยกว่า
Pipeline, pattern matching และ Records+Tuples ล้วนถูกทำงานมานานกว่า 4 ปีแล้ว และยังค้างอยู่แค่ stage 1–2 ในช่วง 1 ปีที่ผ่านมาแทบไม่เห็นความคืบหน้าที่มีนัยสำคัญ ยกเว้น pattern matching อยู่บ้าง
ตาม issue ใน repository ของ Records และ Tuples มีแรงต้านเรื่อง value semantics หรือก็คือ
===จะทำงานได้หรือไม่ ถ้าตัด value semantics ออก ประโยชน์ของข้อเสนอก็ลดลงอย่างมากกว่าจะไปถึง stage 3 คงต้องใช้เวลาอย่างน้อยอีก 1–2 ปี หรืออาจไปไม่ถึงเลยก็ได้ อย่างน้อยฟังก์ชันจัดกลุ่ม array ก็มีแล้ว
ยังอยู่แค่ stage 1 เลยน่าเศร้าที่น่าจะต้องรออีกหลายปี
Dictionary ของ AS3 เป็นชนิดที่ใช้ object reference, string และ number เป็นคีย์ที่ไม่ซ้ำกันได้ และผูกค่าชนิดใดก็ได้เข้าไปได้ Garbage collection ก็จัดการให้ไม่เป็น weak reference ตราบเท่าที่ตัว dictionary object ยังมีชีวิตอยู่
ให้นึกถึง Set ของ JavaScript แต่เป็นรูปแบบที่ใช้คีย์ชนิดใดก็ได้ตามที่กำหนดอย่าง strongly typed และโยน error ตั้งแต่ compile time คิดถึงภาษานั้นจริง ๆ
อัปเดตเหล่านั้นแทบจะทำลาย ecosystem ของ JavaScript ไปแล้ว และตอนนี้รู้สึกเหมือนเหลือแต่ภาษาที่ compile เป็น JS คนที่ยังเขียน vanilla JS อยู่ก็เหมือนคนที่สร้างแอปด้วย assembly
สงสัยว่าข้อมูลของแต่ละ timezone ใน Temporal จะถูกทำให้ทันสมัยอยู่เสมอได้อย่างไร
สงสัยว่าโครงสร้างเป็นแบบที่ TC39 อัปเดตข้อมูลไว้ที่ไหนสักแห่ง แล้วแต่ละเบราว์เซอร์คัดลอกข้อมูลนั้นเข้าไปภายในและออกเวอร์ชันใหม่หรือไม่ และถ้าผู้ใช้ยังไม่ได้อัปเดตเป็นเบราว์เซอร์ที่มีข้อมูลใหม่ ผู้ใช้จะเห็นเวลาผิดบนเว็บไซต์ของเราหรือเปล่า
ตัวอย่างเช่น เม็กซิโกยกเลิก เวลาออมแสง ในปี 2022: https://en.wikipedia.org/wiki/Time_in_Mexico
ไลบรารี third-party อย่าง
pytzหรือmoment-timezoneแค่อัปเดตไลบรารีฝั่งเซิร์ฟเวอร์ก็พอ และถ้าจัดการใน standard library ก็อัปเวอร์ชันภาษาได้ แต่ไม่แน่ใจว่า Temporal กับเบราว์เซอร์ของผู้เข้าชมจะเป็นอย่างไรคอมพิวเตอร์ของผู้ใช้น่าจะเข้าถึง database นี้ได้และจัดการอัปเดตได้ แต่ก็ไม่แน่ใจ เบราว์เซอร์อาจดาวน์โหลดและดูแล database นี้เองต่างหาก หรืออาจขึ้นอยู่กับ implementation
database ที่เกี่ยวข้อง: https://en.wikipedia.org/wiki/Tz_database
Intlดังนั้นถ้าไปสำรวจฝั่งนั้นก็น่าจะได้คำตอบคล้ายกันtzdbแน่นอนถ้าผู้ใช้ไม่ได้อัปเดตเบราว์เซอร์หรือระบบให้สะท้อนข้อมูล timezone ใหม่ ก็โดยรวมแล้วดูจะถูกต้องที่อาจเห็นเวลาผิดได้ แต่สิ่งนี้ก็ไม่ได้ต่างจากแนวปฏิบัติทั่วไปในปัจจุบันมากนัก
ทางเลือกคือให้ทุกแอปพลิเคชันพก
tzdbของตัวเอง ซึ่งบางแอปก็ทำแบบนั้นและมีกรณีที่สมเหตุสมผล แต่โดยทั่วไปแล้วเป็นการสิ้นเปลือง เพิ่มความไม่สอดคล้องกันระหว่างแอปพลิเคชัน และวงรอบการอัปเดตก็มีแนวโน้มจะช้ากว่าต้องเพิ่มอีเวนต์สำหรับตรวจจับเมื่อมีคนเปลี่ยนเขตเวลา
ในรายการ “ความเชื่อผิด ๆ ที่โปรแกรมเมอร์มีเกี่ยวกับเวลา” น่าจะเพิ่มข้อว่า “โปรแกรมเมอร์เชื่อว่าเขตเวลาจะคงที่ระหว่างการใช้งาน” ได้ด้วย ในความเป็นจริงมีผู้คนนับล้านเดินทางข้ามเขตเวลาทุกวัน
แน่นอนว่าอาจมีประโยชน์สำหรับไลบรารี
เสียดายมากที่
.Nowไม่ใช่การเรียกฟังก์ชัน ไม่ควรเป็นพร็อพเพอร์ตีถ้าประเมิน
.Nowหลายครั้งในลูป ค่าอาจต่างกันทุกครั้ง ซึ่งเป็นสิ่งที่ไม่คาดคิดC# ก็เลือกแบบเดียวกัน และไม่ควรทำแบบนั้น: https://ericlippert.com/2014/05/19/when-should-i-write-a-pro...
Nowเป็น เนมสเปซ ของฟังก์ชันที่ดึงค่าจริง ๆ เช่นNow.instant()อะไรแบบนั้นชอบข้อเสนอ Temporal มากจริง ๆ แต่มีเรื่องหนึ่งที่ติดใจ คือการเปรียบเทียบพึ่งพา ความเท่ากันของการอ้างอิง
กล่าวคือ
Temporal.Instant.from('2020-01-01') != Temporal.Instant.from('2020-01-01')มันไม่ได้แย่โดยตัวมันเอง แต่แทบจะตัดความสามารถในการใช้ออบเจ็กต์เหล่านี้เป็นคีย์ของ
Mapหรือรวบรวมไว้ในSetไปเลย เข้าใจว่าทำไมถึงตัดสินใจแบบนั้น แต่ก็เสียดายที่ทำไม่ได้สักวันถ้า Records และ Tuples ออกมาจริง ๆ อาจมีเวอร์ชันที่อิงกับสิ่งนั้นก็ได้
==ให้ความเท่ากันแบบไม่ใช่การอ้างอิงบ้างไหม?.epochMillisecondsเป็นคีย์หรือสมาชิกของMap/Setได้ แต่ถ้าต้องเก็บข้อมูลเขตเวลาไว้ในMapหรือจำเป็นต้องทำ operation เพิ่มเติมกับInstantก็ต้องเก็บInstantเดิมไว้ฝั่ง valueในกรณีของ
Setสามารถใช้แบบMap{v.epochMilliseconds:v}เพื่อคงInstantไว้ได้ไม่ได้ยอดเยี่ยม แต่เรื่องนี้ควรโทษ JavaScript เอง มากกว่า Temporal จะให้ runtime จัดการก็ได้ แต่ถ้าอย่างนั้น polyfill ก็จะล้มเหลว
Map/Setก็คล้ายกับการใช้เลข floating point ในMap/Setซึ่งโดยทั่วไปเป็นไอเดียที่ไม่ดีString()หรือ'2020-01-01'ไปเลยไม่ได้เหรอ?การมี ฟังก์ชันเปรียบเทียบ ที่ทำงานร่วมกับ API เดิมได้เป็นการออกแบบที่แข็งแรงมาก ถึงขั้นควรกำหนดเป็นเงื่อนไขที่ต้องอ่านก่อนเพิ่ม type ใหม่เลยก็ได้
เช่น ส่ง
Temporal.Duration.compareให้sortก็จะจัดเรียงได้เป็นPT1H,PT1H30M,PT1H45M,PT2Hขอปรบมือให้ผู้ออกแบบเข้าใจว่าชื่อ
Temporalตั้งใจหลีกเลี่ยงการชนกับออบเจ็กต์เวลาแบบทั่วไปอย่าง Moment, Datetime แต่ชื่อนี้ไม่ค่อยดีตอนเห็นครั้งแรกนึกว่าเป็นอะไรทำนอง การควบคุม garbage collection
temporalมีความหมายว่าเกี่ยวกับเวลาเมื่อเทียบกับความเป็นนิรันดร์, เกี่ยวกับ tense หรือการแบ่งเวลาในไวยากรณ์, หรือเกี่ยวกับเวลาเมื่อแยกจากพื้นที่: https://www.merriam-webster.com/dictionary/temporalฟังดูเป็นชื่อที่โอเค
อย่างแรก
Temporalเป็นคำคุณศัพท์ ไม่ใช่คำนาม ถึงจะเกี่ยวกับเวลาแต่ก็ไม่ได้ตรงกับสัญชาตญาณนักที่สำคัญกว่านั้นคือ ถ้าเลือกชื่อแปลก ๆ เพื่อลดโอกาสชนกับโค้ดเก่า ภาษาโดยรวมก็จะยิ่งทึบเข้าใจยากขึ้นเมื่อเวลาผ่านไป
ตอนเพิ่ม
PromiseกับGeneratorก็มีไลบรารีจำนวนมากที่ใช้ชื่อออบเจ็กต์เหล่านั้นอยู่แล้ว ต่างจาก reserved word ตรงที่ built-in object สามารถถูกเขียนทับได้ จึงไม่ได้เป็นปัญหาใหญ่ผมคิดว่าคณะกรรมการมาตรฐานควรยืนหยัดใช้
Timeเพื่อสุขภาพระยะยาวของภาษาแน่นอนว่าการถกเถียงนี้ผ่านไปแล้ว และผู้ผลิตเบราว์เซอร์กับผู้พัฒนา JS engine ก็คงตกลงกันแล้ว
DateV2ยังดีกว่าเข้าใจว่าต้องมี backward compatibility แต่
Temporalฟังแล้วไม่ดีเลยDateTimeก็ไม่ใช่ชื่อที่มีอยู่ในมาตรฐาน JS อยู่แล้ว ไม่รู้ทำไมถึงไม่ใช้ชื่อนั้น จนกว่าจะถึงตอนนั้นคงตั้งconst DateTime = Temporalไว้ก่อนบทความที่เกี่ยวข้อง:
JavaScript Temporal Is Coming - https://news.ycombinator.com/item?id=42809834 - มกราคม 2025, 18 ความคิดเห็น
Mozilla: Temporal (Limited Availability) - https://news.ycombinator.com/item?id=42776548 - มกราคม 2025, 1 ความคิดเห็น
Is It Time for the JavaScript Temporal API? - https://news.ycombinator.com/item?id=29712118 - ธันวาคม 2021, 100 ความคิดเห็น
Temporal: Getting started with JavaScript's new date time API - https://news.ycombinator.com/item?id=27661667 - มิถุนายน 2021, 194 ความคิดเห็น
JavaScript Temporal - https://news.ycombinator.com/item?id=27395236 - มิถุนายน 2021, 1 ความคิดเห็น
JavaScript Proposal Temporal for Dates is now stage 3 - https://news.ycombinator.com/item?id=26432346 - มีนาคม 2021, 1 ความคิดเห็น
คำพูดที่ว่าเรือลำใหญ่เปลี่ยนทิศช้านี่ตรงมาก