เครื่องมือสำหรับนักพัฒนา · ตัวแปลงการประทับเวลา Unix
วิธีที่เบราว์เซอร์แปลงยุคเป็นเวลาท้องถิ่นด้วยวันที่และนานาชาติ
· มันทำงานอย่างไร
การประทับเวลา javascript เบราว์เซอร์-apis
ตัวแปลงเบราว์เซอร์ไม่มีฐานข้อมูลนาฬิกาเซิร์ฟเวอร์หรือเขตเวลาของตัวเอง มันขึ้นอยู่กับวัตถุ Date และ Intl API ที่สนับสนุนโดยระบบปฏิบัติการของคุณ โพสต์นี้จะอธิบายไปป์ไลน์นั้นและข้อจำกัดของมัน
เบราว์เซอร์ได้รับ 'ท้องถิ่น' มาจากไหน — ยุคเดียวกันแสดงแตกต่างกันบนแล็ปท็อปและโทรศัพท์ในห้องเดียวกัน
อุปกรณ์สองเครื่องที่อยู่ติดกันสามารถเรนเดอร์หนึ่งยุคที่แตกต่างกันได้เมื่อโซนภายในเครื่องที่กำหนดค่าต่างกัน จำนวนเต็มไม่เปลี่ยนแปลงระหว่างแล็ปท็อปและโทรศัพท์ แต่ละเบราว์เซอร์จะสร้าง Instant เดียวกัน จากนั้นจึงจัดเตรียมฟิลด์ปฏิทินท้องถิ่นสำหรับสภาพแวดล้อมของตนเอง “ท้องถิ่น” จึงอธิบายถึงผู้อ่าน ไม่ใช่ทรัพย์สินที่สืบทอดมาในยุคนั้น
ToolAcre ทำให้การพึ่งพานั้นมองเห็นได้โดยการติดป้ายกำกับแถวท้องถิ่นด้วย `Intl.DateTimeFormat().resolvedOptions().timeZone` ภาพหน้าจอที่ระบุเวลานาฬิกาหนึ่งรายการและบันทึกของเซิร์ฟเวอร์ที่ระบุว่าอีกรายการหนึ่งอาจเป็นค่าที่อ่านได้จริงทั้งคู่ เปรียบเทียบ UTC แถวก่อน การจับคู่ UTC เอาต์พุตแสดงให้เห็นว่าการนำเสนอนั้นแตกต่าง แทนที่จะเป็นอินสแตนซ์ที่สำคัญ
วันที่ใช้เวลาเป็นมิลลิวินาที — สัญญาของตัวสร้าง ทำไมวินาทีจึงต้องคูณด้วยพัน และช่วงวันที่สามารถเป็นตัวแทนได้
JavaScript `Date` ได้รับมิลลิวินาทีจากยุค ToolAcre ของ `fromEpoch` คูณอินพุตวินาทีด้วย 1,000 และปล่อยให้อินพุตมิลลิวินาทีไม่เปลี่ยนแปลงก่อนที่จะสร้างวัตถุ การแปลงดังกล่าวมีความชัดเจน เนื่องจากการส่ง 1,717,243,200 โดยตรงไปยัง `new Date` จะหมายถึงประมาณยี่สิบวันหลังจาก 1970 ไม่ใช่ 2024 ในเดือนมิถุนายน
การใช้งานจะปฏิเสธจำนวนไม่จำกัดและค่าที่ตีความใดๆ ที่เกินกว่า ±8.64×10¹⁵ มิลลิวินาทีก่อนการจัดรูปแบบ ขีดจำกัดนั้นมาจากช่วงวันที่ที่ระบุในแหล่งที่มา ไม่ใช่จากฐานข้อมูลหรือนาฬิกาของระบบปฏิบัติการ การเปลี่ยนตัวเลือกสามารถย้ายค่าข้ามขอบเขตได้ ดังนั้นข้อผิดพลาดจะบอกคุณด้วยว่ามีการใช้หน่วยใด
ตัวเข้าถึง UTC กับตัวเข้าถึงแบบโลคัล — getUTCHours และ getHours และวิธีที่กลไกใช้ออฟเซ็ต
ToolAcre ไม่ได้แยกฟิลด์ที่มี `getUTCHours` และ `getHours`; ข้อความเข้าถึงของเค้าร่างมีความเฉพาะเจาะจงมากกว่าการใช้งาน ระบบจะขอให้ `Intl.DateTimeFormat` จัดรูปแบบวันที่หนึ่งครั้งด้วย `timeZone: "UTC"` และอีกครั้งโดยไม่มีการแทนที่โซน การโทรทั้งสองได้รับค่ามิลลิวินาทีเท่ากัน ดังนั้นจึงไม่สามารถย้ายเหตุการณ์ได้
ความแตกต่างนั้นมีความสำคัญเมื่อทำการดีบัก หากแถววินาทีและมิลลิวินาทีสอดคล้องกับผู้ผลิตแต่ป้ายกำกับในเครื่องทำให้คุณประหลาดใจ ให้ตรวจสอบโซนของเบราว์เซอร์แทนที่จะเพิ่มชั่วโมงให้กับยุค การคำนวณออฟเซ็ตด้วยตนเองจะสร้างช่วงเวลาที่แตกต่างออกไป จากนั้นปล่อยให้ตัวจัดรูปแบบใช้กฎท้องถิ่นอีกครั้ง ทำให้เกิดข้อผิดพลาดในการปรับค่าสองครั้งแบบคลาสสิก
UTC และการจัดรูปแบบในตัวเครื่องขอให้กลไกอ่านค่าสองครั้งในหนึ่งวัน
ตัวแปลงสามารถพิสูจน์ได้ว่าขอเบราว์เซอร์สำหรับ `resolvedOptions().timeZone`; ไม่สามารถพิสูจน์ได้ว่ากลไกเฉพาะได้รับกฎเขตเวลาทั้งหมดจากระบบปฏิบัติการ ข้อมูลที่รวมไว้ หรือชั้นแพลตฟอร์มอื่นหรือไม่ แหล่งที่มาจงใจถือว่าเครื่องจักรนั้นเป็นความรับผิดชอบของเครื่องยนต์ และกลับไปใช้วลี "เวลาท้องถิ่น" หากการค้นหาโซนล้มเหลว
ขอบเขตหลักฐานนี้มีประโยชน์ โซนที่มีชื่อในผลลัพธ์จะระบุตัวเลือกปัจจุบันของเบราว์เซอร์ แต่ไม่ใช่รายงานเวอร์ชันสำหรับฐานข้อมูลโซนเวลา หากสภาพแวดล้อมทั้งสองไม่เห็นด้วยกับวันที่เก่า ให้บันทึกเบราว์เซอร์ ระบบปฏิบัติการ และโซนที่แสดง ตัวแปลงให้การสังเกต ไม่ได้วินิจฉัยแพ็คเกจข้อมูลที่อยู่เบื้องหลังสนามบินนานาชาติ
เบราว์เซอร์จะรายงานโซนภายในเครื่อง ในขณะที่แหล่งที่มาของกฎยังคงเป็นรายละเอียดการใช้งาน
สำหรับแถว ISO นั้น `toISOString()` ให้สตริง UTC โดยมี Z ต่อท้ายและเศษส่วนสามหลัก UTC และแถวท้องถิ่นที่มนุษย์สามารถอ่านได้ใช้ตัวจัดรูปแบบภาษาอังกฤษแบบบริเตนใหญ่พร้อมตัวเลขปี เดือนแบบย่อ วันสองหลัก และนาฬิกา 24 ชั่วโมง ตัวจัดรูปแบบยังร้องขอ `shortOffset` ทำให้ส่วนออฟเซ็ตที่เกี่ยวข้องของแต่ละแถวที่แสดงผล
ตัวเลือกเหล่านั้นอธิบายว่าทำไมการคัดลอก `Date.toString()` จากคอนโซลจึงไม่เทียบเท่ากับหลักฐาน ร้อยแก้วที่แน่นอนขึ้นอยู่กับสถานที่และอยู่นอกสัญญาเอาท์พุตของเครื่องมือนี้ ToolAcre แก้ไขตัวเลือกการแสดงผล ในขณะที่ยังคงปล่อยให้โซนท้องถิ่นจริงเปลี่ยนแปลงไป คัดลอกค่า ISO เมื่อระบบอื่นต้องการการเปรียบเทียบที่เครื่องอ่านได้อย่างเสถียร
ตัวอย่างการทำงาน: หนึ่งยุค สามเอาต์พุต - สตริง UTC ISO เวลาจัดรูปแบบในเครื่องและออฟเซ็ตเป็นนาทีจาก getTimezoneOffset
ป้อน 1,717,243,200 และเลือกวินาที การคูณจะสร้าง 1,717,243,200,000 มิลลิวินาที ซึ่งการทดสอบกำหนดเป็น `2024-06-01T12:00:00.000Z` รูปแบบแถว UTC ที่เกิดขึ้นทันทีใน UTC; แถวในเครื่องจะจัดรูปแบบวันที่เหมือนกันในโซนเบราว์เซอร์และตั้งชื่อโซนนั้น แถววินาทีและมิลลิวินาทีจะรักษารูปแบบตัวเลขทั้งสองไว้
ต้องอ่านนาฬิกาท้องถิ่นและออฟเซ็ตที่แม่นยำจากอุปกรณ์ที่รันตัวอย่าง การเผยแพร่ที่นี่จะถือว่าผู้อ่านทุกคนมีโซนเดียวกัน นั่นคือเหตุผลที่การตรวจสอบที่ได้ผลนี้ใช้การยืนยัน ISO เป็นผลลัพธ์คงที่ และถือว่าเอาต์พุตในเครื่องเป็นค่าที่สังเกตได้ หาก ISO แตกต่าง ให้กลับมาที่หน่วยที่เลือกอีกครั้งก่อนที่จะตรวจสอบการตั้งค่าตำแหน่ง
ตัวอย่างการทำงาน: หนึ่งยุค สามเอาต์พุต ToolAcre เปิดเผยจริง
เส้นทางนี้ไม่มีตัวเลือกสำหรับโซนที่สามตามอำเภอใจ `formatInZone` สามารถยอมรับโซนภายในได้ แต่แผงควบคุมจะเรียกโซนดังกล่าวสำหรับ UTC และสำหรับค่าเริ่มต้นของเบราว์เซอร์เท่านั้น บทความที่อ้างว่าผู้ใช้สามารถเลือกโตเกียว ไนโรบี หรือโตรอนโตจะอธิบายอินเทอร์เฟซที่ไม่ได้จัดส่ง แม้ว่า Intl จะสามารถรองรับการจัดรูปแบบดังกล่าวในที่อื่นได้ก็ตาม
นอกจากนี้ยังไม่เปิดเผยการเลือกปฏิทิน การเลือกสถานที่ หรือการแก้ไขฐานข้อมูลโซนเวลา สำหรับการแปลงข้ามสำนักงาน ให้คงยุคสมัยไว้เป็นจุดยึดและใช้เครื่องมือที่มีอินเทอร์เฟซที่จัดทำเอกสารไว้ตั้งชื่อโซนเป้าหมาย คำสัญญาที่แคบกว่านั้นมีค่า: universal UTC นอกเหนือจากสภาพแวดล้อมภายในเครื่อง โดยไม่มีเซิร์ฟเวอร์ที่ซ่อนอยู่คอยตัดสินความหมายของท้องถิ่น
ประเด็นสำคัญ: เบราว์เซอร์ของคุณคือนาฬิกาและแผนที่ — และวิธีที่ตัวแปลงเวลาประทับของ Unix ใช้เพื่อแสดง UTC และแบบเคียงข้างกันในเครื่องโดยไม่มีเซิร์ฟเวอร์
เบราว์เซอร์ทำหน้าที่เป็นทั้งกลไกทางคณิตศาสตร์และสภาพแวดล้อมการนำเสนอ ToolAcre แก้ไขหน่วย สร้างหนึ่งวันที่ ขอค่า ISO ตามรูปแบบบัญญัติ จากนั้นจัดรูปแบบ UTC และการอ่านค่าในเครื่องเคียงข้างกัน ไม่จำเป็นต้องมีบริการแปลงระยะไกลสำหรับขั้นตอนเหล่านั้น และหน่วยที่แสดงจะเก็บการตัดสินใจแบบปัจจัยของ-1,000ไว้สำหรับการตรวจสอบ
เมื่อเอาต์พุตไม่ตรงกันในอุปกรณ์ต่างๆ ให้เปรียบเทียบแถว ISO บันทึกประจำหน่วย และโซนท้องถิ่นที่มีชื่อตามลำดับนั้น ข้อสังเกตทั้งสามนี้จะแยกระหว่างทันที ปรับขนาด และการนำเสนอ การปฏิบัติต่อนาฬิกาท้องถิ่นในฐานะที่เป็นแหล่งที่มาของความจริงจะยุบคำถามทั้งสามข้อให้เป็นคำถามเดียว และทำให้การแปลงที่ถูกต้องดูผิดเมื่อใดก็ตามที่ผู้ดูเปลี่ยนโซน