เครื่องมือสำหรับนักพัฒนา · ตัวแปลงการประทับเวลา Unix
เขตเวลาไม่มีการชดเชย: ฐานข้อมูล IANA tz และเหตุใดจึงสำคัญ
· พื้นหลัง
การประทับเวลา โซนเวลา เบราว์เซอร์-apis
ออฟเซ็ตคือตัวเลข เขตเวลาคือประวัติของตัวเลขและกฎเกณฑ์เมื่อมีการเปลี่ยนแปลง โพสต์นี้จะอธิบายความแตกต่าง แนะนำฐานข้อมูล IANA tz ที่เข้ารหัส และแสดงให้เห็นว่าเหตุใดผู้แปลงจึงพึ่งพาฐานข้อมูลดังกล่าวสำหรับการอ่านในท้องถิ่น
การประชุมที่เลื่อนไปหนึ่งชั่วโมง — ค่าชดเชยที่เก็บไว้คือ +02:00 ที่ถูกในเดือนกรกฎาคมและผิดในเดือนธันวาคม
`+02:00` แบบคงที่ที่บันทึกไว้ข้างการประชุมในเดือนกรกฎาคมอาจเป็นการอ่านที่เที่ยงตรงในขณะนั้นและยังคงล้มเหลวตามกฎของเดือนธันวาคม การชดเชยคือผลลัพธ์เดียว โซนคือบริบทของกฎที่สามารถสร้างผลลัพธ์ในวันที่ต่างกันได้ การจัดเก็บอันหนึ่งราวกับว่าเป็นอีกอันหนึ่งจะทำให้สแนปชอตค้าง
แถวท้องถิ่นของ ToolAcre ขอให้ Intl จัดรูปแบบวันที่แต่ละวัน และขอออฟเซ็ตตัวเลขสั้นๆ มันไม่ได้เพิ่มค่าคงที่การกำหนดค่าให้กับยุค การออกแบบดังกล่าวช่วยให้กฎที่บังคับใช้ของสภาพแวดล้อมมีอิทธิพลต่อทุกช่วงเวลาแยกจากกัน
ออฟเซ็ตเทียบกับโซน — ระยะทางคงที่จาก UTC เทียบกับภูมิภาคที่ตั้งชื่อด้วยกฎ DST และประวัติการเปลี่ยนแปลง
ออฟเซ็ตระบุว่านาฬิกาที่เรนเดอร์อยู่ห่างจาก UTC แค่ไหนในคราวเดียว ภูมิภาคที่มีชื่อสามารถมีลำดับของกฎออฟเซ็ตและการเปลี่ยนแปลงในอดีตได้ ยุคสมัยเองก็ไม่มีเช่นกัน แนวคิดเหล่านี้ควรใช้ฟิลด์แยกต่างหากเมื่อแอปพลิเคชันต้องการทั้งกิจกรรมและกำหนดการตามสถานที่
สำหรับเหตุการณ์ที่ไม่เปลี่ยนรูป การจัดเก็บ Instant อาจเพียงพอแล้ว สำหรับ “เปิดที่ 09:00 ในภูมิภาคนี้ทุกวัน” ให้คงโซนที่มีชื่อไว้ เนื่องจากอินสแตนซ์ในอนาคตจะต้องได้รับการแก้ไขจากเวลาวอลล์ การใช้ออฟเซ็ตของเมื่อวานซ้ำจะถือว่ากฎไดนามิกเป็นคุณสมบัติตัวเลขถาวร
ฐานข้อมูล IANA tz — ชื่อ Area/City เหตุใดจึงเป็นบันทึกการตัดสินใจทางการเมือง และความถี่ในการอัปเดต
สมุดงานชื่อฐานข้อมูล IANA ที่มาทางการเมือง และความถี่ในการอัปเดต การใช้งานรายงานชื่อโซนสไตล์ IANA จาก `resolvedOptions()` แต่ไม่เปิดเผยเวอร์ชันฐานข้อมูล กำหนดการอัพเดต หรือแพ็คเกจต้นทาง รายละเอียดเหล่านั้นไม่ได้ระบุไว้ที่นี่
ข้อจำกัดนี้ส่งผลต่อการสืบพันธุ์ หากเอาต์พุตวันที่เก่าแตกต่างกันระหว่างเครื่อง ให้บันทึกสตริงโซนและเวอร์ชันแพลตฟอร์ม อย่าอ้างว่าชุดกฎใดใหม่กว่าจากนาฬิกาเพียงอย่างเดียว โซนที่มีชื่อช่วยปรับปรุงคำถาม แต่ตัวแปลงไม่ใช่ตัวตรวจสอบข้อมูลโซนเวลา
แอปพลิเคชันที่ต้องการเอาต์พุตในอดีตที่ทำซ้ำได้ควรควบคุมการขึ้นต่อกันของข้อมูลโซนและวันที่ของตัวแทนการทดสอบ การใช้สภาพแวดล้อมเบราว์เซอร์ที่ไม่ระบุจะมอบความสามารถในการทำซ้ำนั้น
แหล่งที่มาของกฎโซนที่มีชื่อและจังหวะการอัปเดตจะไม่ถูกเปิดเผยโดยการใช้งานนี้
ToolAcre ถามเบราว์เซอร์เกี่ยวกับโซนท้องถิ่นและรูปแบบผ่านสนามบินนานาชาติ พื้นที่เก็บข้อมูลไม่ได้กำหนดว่ากฎมาจากระบบปฏิบัติการ บันเดิลเบราว์เซอร์ หรือส่วนประกอบรันไทม์อื่นหรือไม่ โดยจะตรวจจับความล้มเหลวและถอยกลับอย่างปลอดภัย แทนที่จะเปิดเผยสถาปัตยกรรมภายในนั้น
ดังนั้น "ท้องถิ่น" หมายถึงสภาพแวดล้อมที่เบราว์เซอร์เลือก ณ เวลาที่เกิด Conversion การเปลี่ยนการตั้งค่าอุปกรณ์สามารถเปลี่ยนเอาต์พุตได้โดยไม่ต้องเปลี่ยนยุค สำหรับเส้นทางการตรวจสอบ ให้คง UTC และจำนวนดิบไว้ ใช้การแสดงผลในเครื่องเป็นบริบทมากกว่าที่เก็บข้อมูลตามรูปแบบบัญญัติ
ทางเลือกสำรองไปที่ ISO เมื่อตัวจัดรูปแบบล้มเหลวจะคงไว้ชั่วคราว แต่จะสูญเสียการนำเสนอในเครื่องที่ร้องขอ ผู้บริโภคควรถือว่าสิ่งนั้นเป็นบริบทการแสดงผลที่ลดลง ไม่ใช่วันที่เปลี่ยนแปลง
เบราว์เซอร์เลือกและจัดรูปแบบโซนท้องถิ่น ไม่มีการยืนยันแหล่งที่มาของกฎ
เลือก UTC สองครั้งที่ห่างกันหกเดือน เช่น `2025-01-15T12:00:00Z` และ `2025-07-15T12:00:00Z` แปลงเป็นวินาที และตรวจสอบแถวในตัวเครื่องบนอุปกรณ์เครื่องเดียว บันทึกว่าออฟเซ็ตตัวเลขแตกต่างกันหรือไม่ การสังเกตนี้ใช้ได้กับโซนและสภาพแวดล้อมที่แสดง
เวิร์กบุคกำหนดออฟเซ็ต Europe/Berlin แต่กฎโซนที่มีชื่อเหล่านั้นไม่ได้อ่านจากการใช้งาน แบบฝึกหัดที่ทำซ้ำได้นี้จะช่วยหลีกเลี่ยงตารางที่ไม่ได้รับการสนับสนุน ในขณะเดียวกันก็สอนความแตกต่างแบบเดียวกัน: การสืบค้นโซนเดียว สองอินสแตนซ์ และอาจชดเชยผลลัพธ์สองรายการ
หากออฟเซ็ตตรงกัน การสังเกตยังคงเป็นข้อมูล: โซนที่กำหนดค่านั้นไม่ได้เปิดเผยความแตกต่างตามฤดูกาลในช่วงเวลาที่เลือกในสภาพแวดล้อมนั้น
ตัวอย่างการทำงาน: สังเกตโซนเบราว์เซอร์หนึ่งโซนในวันที่สองวัน แทนที่จะใช้กฎเบอร์ลินแบบฮาร์ดโค้ด
แผงร้องขอ `timeZoneName: "shortOffset"` ซึ่งสนับสนุนความสัมพันธ์ที่เป็นตัวเลข เช่น GMT+1 มากกว่าตัวย่อระดับภูมิภาค ตัวเลือกดังกล่าวช่วยลดการพึ่งพาป้ายกำกับที่ความหมายอาจแตกต่างกันไปตามบริบท แม้ว่าการจัดรูปแบบ International ที่แน่นอนจะยังคงเป็นผลลัพธ์ของแพลตฟอร์มก็ตาม
สำหรับข้อมูลที่จัดเก็บ ให้ใช้ตัวระบุโซน Canonical ที่กำหนดโดยไลบรารีที่เลือกของแอปพลิเคชัน แทนที่จะแสดงตัวย่อ ป้ายกำกับแบบสั้นที่ผู้ใช้เห็นอาจมีประโยชน์ แต่ไม่ควรกลายเป็นกุญแจสำคัญในการสร้างกำหนดการใหม่ในอนาคต
ออฟเซ็ตตัวเลขยังคงเป็นเลขคณิตที่ชัดเจนในคราวเดียว ข้อจำกัดของพวกเขาคือไม่มีข้อมูลระบุตัวตนของกฎ ไม่ใช่ไม่สามารถแมปนาฬิกาหนึ่งนาฬิกาที่อ่านกลับไปที่ UTC
หลีกเลี่ยงการใช้คำย่อในข้อมูลที่จัดเก็บ ตัวจัดรูปแบบขอออฟเซ็ตตัวเลขแบบสั้น
การจัดกำหนดการในอนาคตจำเป็นต้องมีช่องว่าง การทับซ้อนกัน และการจัดการนโยบายที่ตัวแปลงนี้ไม่มีให้ เริ่มต้นด้วยวันที่หรือยุคที่ได้รับการแก้ไขแล้วจึงแสดงผล จะไม่เลือกระหว่างเวลาท้องถิ่นที่ซ้ำกันสองครั้งหรือซ่อมแซมเวลาท้องถิ่นที่ไม่มีอยู่
ใช้ไลบรารีการจัดกำหนดการแบบ Zone-Aware ซึ่งมีการทดสอบพฤติกรรมตามความต้องการของคุณ จากนั้นตรวจสอบเหตุการณ์ที่แก้ไขแล้วที่นี่หากมีประโยชน์ การแยกความละเอียดออกจากจอแสดงผลทำให้ตัวแปลงธรรมดาไม่กลายเป็นตัวกำหนดตารางเวลาโดยไม่ได้ตั้งใจด้วยนโยบาย Edge ที่ไม่ได้กำหนดไว้
เอาต์พุตของตัวกำหนดตารางเวลาสามารถจัดเก็บเป็นยุคสำหรับการดำเนินการในขณะที่ยังคงรักษาโซนและจุดประสงค์ของเวลาวอลล์ดั้งเดิมสำหรับการคำนวณใหม่หรือการอธิบายในอนาคต
Takeaway: จัดเก็บ Instants เป็นยุค, จัดเก็บสถานที่เป็นชื่อโซน - และวิธีที่ตัวแปลงการประทับเวลา Unix ใช้โซนของเบราว์เซอร์ของคุณสำหรับการอ่านในเครื่อง
จัดเก็บ Instants เป็นหน่วย Epoch ที่ชัดเจนหรือสตริง UTC ตามรูปแบบบัญญัติ และจัดเก็บโซนที่มีชื่อเมื่อสถานที่นั้นมีความสำคัญ ออฟเซ็ตสามารถมาพร้อมกับเอาต์พุตสำหรับคำอธิบาย แต่ไม่สามารถใช้ทดแทนฟิลด์ใดฟิลด์หนึ่งได้ UTC ของ ToolAcre และแถวท้องถิ่นแสดงให้เห็นถึงการแยกดังกล่าว
เมื่อผลลัพธ์ในพื้นที่ทำให้คุณประหลาดใจ ให้ตรวจสอบป้ายกำกับโซน ทันทีและชดเชยก่อนที่จะเปลี่ยนแปลงข้อมูล แพตช์ชดเชยคงที่อาจทำให้วันที่หนึ่งดูถูกและอีกวันผิด รุ่นที่ทนทานช่วยให้เหตุการณ์มีเสถียรภาพและให้กฎโซนที่ได้รับการตรวจสอบแล้วจัดหาหน้าปัดนาฬิกา
โมเดลนี้ยังรองรับการเดินทาง: ผู้ใช้สามารถดูทันทีที่จัดเก็บไว้ในโซนท้องถิ่นใหม่โดยไม่ต้องเขียนเหตุการณ์ใหม่หรือสูญเสียบริบทการจัดกำหนดการดั้งเดิม