ไม่มีการอัปโหลด, 100% ในเครื่อง, ไม่มีบัญชี

บทความ

ระยะเวลาแบบ ISO 8601: P1DT2H หมายถึงอะไร

คำตอบจาก API ของ YouTube ระบุว่าวิดีโอหนึ่งมีความยาว PT4M13S คำเชิญในปฏิทินมีค่า P15DT5H0M20S เซิร์ฟเวอร์ไดเรกทอรีแห่งหนึ่งประทับเวลาบัญชีด้วย 20260424174227.0Z ซึ่งดูเหมือนจะเกี่ยวข้องกันแต่จริงๆ แล้วเป็นคนละเรื่องกันเลย สตริงกระชับเหล่านี้เป็นไปตามกฎที่ควรรู้ไว้ เพราะการอ่านผิดจะเปลี่ยนนาทีให้กลายเป็นเดือน นี่คือการพาชมรูปแบบระยะเวลาของ ISO 8601: ตัวอักษรแต่ละตัวหมายถึงอะไร รูปแบบนี้ปรากฏที่ไหนบ้าง และจุดที่ละเอียดอ่อนที่สุด นั่นคือระยะเวลาที่เขียนแบบนี้ไม่ได้เป็นปริมาณเวลาคงที่เสมอไป

P, T และความหมายของตัวอักษร

ระยะเวลาแบบ ISO 8601 เริ่มต้นด้วย P (period) ตามด้วยส่วนประกอบของวันที่ แต่ละส่วนเป็นตัวเลขตามด้วยตัวอักษรหน่วย: Y คือปี M คือเดือน W คือสัปดาห์ D คือวัน ตัวอักษร T จะแบ่งส่วนวันที่ออกจากส่วนเวลา: H คือชั่วโมง M คือนาที S คือวินาที ทุกส่วนประกอบเป็นตัวเลือก คุณเขียนเฉพาะสิ่งที่ต้องการเท่านั้น PT15M คือ 15 นาที P1DT2H คือหนึ่งวันกับสองชั่วโมง P3W คือสามสัปดาห์ ตัวอักษร T ไม่ใช่แค่ของประดับ: M หมายถึงเดือนก่อนตัว T และหมายถึงนาทีหลังตัว T ดังนั้น P1M คือหนึ่งเดือน ในขณะที่ PT1M คือหนึ่งนาที ส่วนประกอบสุดท้ายที่ปรากฏสามารถมีเศษทศนิยมได้ เช่น PT0.5S หมายถึงครึ่งวินาที และหน่วยเหล่านี้จะไม่ทดเลขให้กันเองโดยอัตโนมัติ: PT90M เป็นวิธีเขียนที่ถูกต้องสมบูรณ์สำหรับหนึ่งชั่วโมงครึ่ง

โครงสร้างของระยะเวลา ISO 8601 P3Y6M4DT12H30M5S: P เริ่มต้นระยะเวลา Y M D คือหน่วยวันที่ T สลับไปยังส่วนเวลา H M S คือหน่วยเวลา

ที่ที่คุณจะพบรูปแบบนี้จริงๆ

ไวยากรณ์นี้ปรากฏอยู่ทุกที่โดยไม่มีใครสังเกต YouTube Data API รายงานความยาวของวิดีโอทุกคลิปเป็นระยะเวลาแบบ ISO 8601 (PT4M13S) HTML รับค่าระยะเวลาในแอตทริบิวต์ datetime ของอิลิเมนต์ time คำเชิญในปฏิทินก็ใช้รูปแบบนี้เช่นกัน: มาตรฐาน iCalendar (RFC 5545) เขียนความยาวของกิจกรรมเป็น PT1H0M0S แม้ว่าจะตัดปีและเดือนออกจากไวยากรณ์ของตัวเองก็ตาม xs:duration ใน XML Schema ครอบคลุมรูปแบบเต็ม และยังอนุญาตให้ใส่เครื่องหมายลบไว้ข้างหน้าเพื่อแทนระยะเวลาที่เป็นลบได้ด้วย ไลบรารีมาตรฐานสามารถแปลงค่านี้ได้โดยตรง: java.time อ่านสตริง P และ T ผ่าน Period.parse และ Duration.parse และการแบ่งแบบเดียวกันนี้ก็มีอยู่ในภาษาอื่นอีกหลายภาษา หากคุณสร้างตารางเวลา ฟีด หรือ API ที่เครื่องอ่านได้ รูปแบบนี้คือภาษากลางสำหรับบอกว่า "นานแค่ไหน"

เหตุใด P1M จึงไม่ใช่จำนวนวินาทีคงที่

PT15M มีค่าเท่ากับ 900 วินาทีเสมอ แต่ P1M ไม่เป็นเช่นนั้น: หนึ่งเดือนอาจยาว 28, 29, 30 หรือ 31 วัน ขึ้นอยู่กับว่าเริ่มต้นจากตรงไหน ดังนั้น P1M จะกลายเป็นค่าที่ชัดเจนได้ก็ต่อเมื่อผูกเข้ากับวันที่แล้วเท่านั้น แม้แต่ P1D ก็ไม่รับประกันว่าจะเท่ากับ 24 ชั่วโมง ในสหภาพยุโรป นาฬิกาจะถูกปรับให้เร็วขึ้นในวันอาทิตย์ที่ 29 มีนาคม 2026 ทำให้วันตามปฏิทินวันนั้นมีเพียง 23 ชั่วโมง: การบวก P1D (หนึ่งวันตามปฏิทิน) กับการบวก PT24H (24 ชั่วโมงเป๊ะ) เข้ากับคืนวันเสาร์เดียวกัน จะไปถึงจุดเวลาที่ต่างกัน นี่คือเหตุผลที่ java.time มีสองประเภท คือ Period สำหรับหน่วยตามปฏิทิน และ Duration สำหรับวินาทีที่แม่นยำ และเป็นเหตุผลที่ไลบรารีวันที่ต้องขอวันที่อ้างอิงก่อนแปลงระยะเวลาใดๆ ให้มองส่วนประกอบ Y, M, W และ D เป็นการคำนวณตามปฏิทิน และมองเฉพาะ H, M และ S เป็นปริมาณเวลาคงที่

ไม่ใช่ระยะเวลา: 20260424174227.0Z

สตริงอย่าง 20260424174227.0Z อาจดูเหมือนอยู่ในตระกูลเดียวกัน แต่จริงๆ แล้วมันคือการประทับเวลา ไม่ใช่ระยะเวลา และก็ไม่ใช่ ISO 8601 ด้วย มันคือ GeneralizedTime ซึ่งเป็นรูปแบบจาก ASN.1 สัญกรณ์ที่ไดเรกทอรี LDAP และใบรับรอง X.509 ใช้ ให้อ่านมันเป็นฟิลด์ความกว้างคงที่: ปี 2026 เดือน 04 วันที่ 24 ตามด้วย 17:42:27 เศษทศนิยมซึ่งเป็นตัวเลือก (.0) และ Z ที่หมายถึง UTC คุณจะพบมันในแอตทริบิวต์ของ Active Directory เช่น whenCreated และ whenChanged ในไฟล์ส่งออกของ LDAP และภายในใบรับรอง ซึ่ง RFC 5280 กำหนดให้ใช้ GeneralizedTime สำหรับวันหมดอายุตั้งแต่ปี 2050 เป็นต้นไป สิ่งที่ทำให้แยกออกจากรูปแบบกระชับของ ISO 8601 ได้คือการไม่มีตัวอักษร T: หากเป็นแบบ ISO ช่วงเวลาเดียวกันนี้จะถูกเขียนเป็น 20260424T174227Z

สตริง GeneralizedTime 20260424174227.0Z ถูกถอดรหัสทีละฟิลด์กลายเป็นวันที่ 24 เมษายน 2026 เวลา 17:42:27 UTC

ถอดรหัสระยะเวลาโดยไม่ต้องอ่านสเปก

สำหรับสตริงที่ใช้เพียงครั้งเดียว ตัวแปลง ISO 8601 duration ของเราจะแยกระยะเวลาแบบ P/T ใดก็ได้ออกเป็นส่วนประกอบและผลรวมเป็นวินาที และสร้างสตริงกลับขึ้นมาจากตัวเลขที่คุณพิมพ์เข้าไป แต่ถ้าสิ่งที่คุณมีคือเวลาสองจุดแทนที่จะเป็นสตริงระยะเวลา (เช่น กะทำงานที่เริ่มตั้งแต่ 22:00 ถึง 06:30) เครื่องคำนวณระยะเวลาจะให้เวลาที่ผ่านไป รวมถึงช่วงที่ข้ามเที่ยงคืนด้วย เครื่องมือทั้งสองทำงานอยู่ในเบราว์เซอร์ของคุณทั้งหมด: สิ่งที่คุณพิมพ์จะไม่ออกจากอุปกรณ์ของคุณเลย และสำหรับการอ่านอย่างรวดเร็วโดยไม่ต้องใช้เครื่องมือใดๆ มีสองข้อสังเกตที่ครอบคลุมกรณีส่วนใหญ่: หา T เพื่อรู้ว่า M หมายถึงเดือนหรือนาที และจำไว้ว่าทุกอย่างทางซ้ายของ T คือการคำนวณตามปฏิทิน ไม่ใช่จำนวนวินาทีคงที่

เครื่องมือที่กล่าวถึงในบทความนี้

คำถามที่พบบ่อย

PT1M เหมือนกับ P1M หรือไม่

ไม่เหมือน ตัวอักษร M เปลี่ยนความหมายไปตามฝั่งของตัวคั่น T: P1M คือหนึ่งเดือน ส่วน PT1M คือหนึ่งนาที นี่คือการอ่านผิดที่พบบ่อยที่สุดของรูปแบบนี้ และเคยทำให้เกิดบั๊กใน API ที่ปล่อยใช้งานจริงมาแล้ว หากไม่แน่ใจ ให้มองหา T ก่อน: ทุกอย่างก่อนหน้านั้นนับเป็นปี เดือน สัปดาห์ และวัน ส่วนทุกอย่างหลังจากนั้นนับเป็นชั่วโมง นาที และวินาที ระยะเวลาที่เขียนถูกต้องจะไม่มีหน่วยเวลาอยู่ก่อน T หรือหน่วยวันที่อยู่หลัง T เลย

จะเขียน 90 นาทีเป็นระยะเวลาแบบ ISO 8601 ได้อย่างไร

ทั้ง PT90M และ PT1H30M ถูกต้องทั้งคู่และหมายถึงปริมาณเวลาเดียวกัน ISO 8601 ไม่ได้บังคับให้ส่วนประกอบต้องอยู่ในช่วงปกติของมัน ดังนั้นนาทีที่เกิน 59 หรือชั่วโมงที่เกิน 23 จึงไม่มีปัญหา ตัวแปลความหมายยอมรับทั้งสองแบบ ส่วนระบบใดจะเลือกเขียนแบบไหนขึ้นอยู่กับว่ามันปรับให้เป็นมาตรฐานหรือไม่ หากคุณสร้างระยะเวลาให้คนอ่าน PT1H30M จะเข้าใจง่ายกว่า แต่ถ้าคุณเปรียบเทียบระยะเวลาในโค้ด ควรเปรียบเทียบผลรวมวินาทีแทนที่จะเปรียบเทียบสตริงโดยตรง เพราะสตริงสองแบบที่ต่างกันอาจมีความหมายเดียวกันได้

ระยะเวลา (duration) กับช่วงเวลา (interval) ต่างกันอย่างไร

ระยะเวลาบอกแค่ว่านานแค่ไหน โดยไม่มีตำแหน่งบนปฏิทิน: P3D คือสามวัน จะเริ่มจากตรงไหนก็ได้ ส่วนช่วงเวลาแบบ ISO 8601 จะผูกระยะเวลาเข้ากับวันที่จริง โดยเขียนด้วยเครื่องหมายทับ: 2026-07-04T00:00:00Z/P3D หมายถึงสามวันที่เริ่มตั้งแต่วันที่ 4 กรกฎาคม 2026 และคู่วันเริ่มต้น/สิ้นสุดอย่าง 2026-07-04/2026-07-07 ก็สื่อถึงช่วงเดียวกันนี้ นอกจากนี้ยังมีช่วงเวลาที่ทำซ้ำโดยมีคำนำหน้า R: R5/2026-07-04T00:00:00Z/P1D หมายถึงการทำซ้ำรายวันห้าครั้งนับจากจุดเริ่มต้นนั้น ช่วงเวลาช่วยแก้ความคลุมเครือของหน่วยตามปฏิทินได้ เพราะ P1M ที่ผูกกับวันที่แล้วจะมีความยาวที่แน่นอนเพียงค่าเดียวเสมอ

แหล่งข้อมูล