Unix Timestamp คืออะไร? คู่มือฉบับสมบูรณ์
Unix Timestamp คืออะไร?
Unix timestamp (หรือที่เรียกว่า POSIX time หรือ Epoch time) คือระบบการติดตามเวลาที่นับจำนวนวินาทีที่ผ่านไปนับตั้งแต่ Unix epoch — 00:00:00 UTC ของวันที่ 1 มกราคม 1970 — โดยไม่นับ leap seconds
แตกต่างจากวันที่ที่มนุษย์อ่านได้ซึ่งแตกต่างกันไปตามเขตเวลา ("19 กรกฎาคม 2026, 15:30 น. EST") Unix timestamp เป็นจำนวนเต็มเพียงหนึ่งเดียวที่แสดงถึงช่วงเวลาเดียวกันทุกที่บนโลก ตัวอย่างเช่น timestamp 1785292800 ตรงกับช่วงเวลาหนึ่งที่แน่นอนไม่ว่าคุณจะอยู่ในนิวยอร์ก ลอนดอน หรือโตเกียว
Unix timestamp เป็นกระดูกสันหลังของการจัดการเวลาในคอมพิวเตอร์สมัยใหม่ ระบบปฏิบัติการ ภาษาโปรแกรม ฐานข้อมูล และระบบไฟล์ล้วนอาศัยการแสดงผลด้วยจำนวนเต็มที่เรียบง่ายนี้เบื้องหลัง
Unix Epoch: ทำไมถึงเป็น 1 มกราคม 1970?
การเลือกวันที่ 1 มกราคม 1970 เป็น "epoch" (จุดเริ่มต้น) ไม่ได้เกิดขึ้นโดยบังเอิญ มีข้อพิจารณาในทางปฏิบัติหลายประการที่นำไปสู่การตัดสินใจนี้:
- การพัฒนา Unix ในยุคแรก: ระบบปฏิบัติการ Unix ถูกพัฒนาที่ Bell Labs ในช่วงปลายทศวรรษ 1960 ถึงต้นทศวรรษ 1970 เมื่อถึงเวลาที่ระบบเวลาถูกทำให้เป็นมาตรฐานในช่วงต้นทศวรรษ 1970 วันที่ 1 มกราคม 1970 เป็นจุดอ้างอิงที่สะอาดและเพิ่งผ่านมาไม่นาน
- ความเรียบง่าย: เวลาบนระบบ Unix ยุคแรกถูกจัดเก็บเป็นจำนวนเต็มแบบมีเครื่องหมาย 32 บิตที่นับวินาที การใช้วันที่ที่เพิ่งผ่านมาทำให้ช่วงที่แสดงผลได้ในอนาคตสูงสุด
- แบบอย่าง: Epoch ถูกกำหนดอย่างเป็นทางการในมาตรฐาน POSIX แรก ทำให้เป็นข้อมูลอ้างอิงสากลสำหรับระบบที่สืบทอดมาจาก Unix
ระบบที่คล้าย Unix ก่อนหน้านี้เคยใช้วันที่ epoch ที่แตกต่างกัน แต่ epoch ปี 1970 ชนะและเป็นมาตรฐานสำหรับระบบที่เข้ากันได้กับ POSIX ทั้งหมดตั้งแต่นั้นมา
ค่า Timestamp ทำงานอย่างไร
แนวคิดหลักตรงไปตรงมา:
- Timestamp
0หมายถึง 1 มกราคม 1970, 00:00:00 UTC อย่างแท้จริง - Timestamp
86400(60 × 60 × 24) หมายถึง 2 มกราคม 1970, 00:00:00 UTC - Timestamp
-3600หมายถึง 31 ธันวาคม 1969, 23:00:00 UTC (timestamp ที่เป็นลบแสดงถึงวันที่ก่อน epoch)
สูตรนั้นเรียบง่าย:
timestamp = วินาทีนับตั้งแต่ 1970-01-01 00:00:00 UTC
Timestamp แบบมิลลิวินาที
ระบบสมัยใหม่จำนวนมาก โดยเฉพาะ JavaScript และ web API ใช้ มิลลิวินาที แทนวินาที Timestamp แบบมิลลิวินาทีคือค่าที่อิงตามวินาทีคูณด้วย 1000:
Date.now()ของ JavaScript คืนค่าเป็นมิลลิวินาทีtime.time()ของ Python คืนค่าเป็นวินาทีแบบ float พร้อมมิลลิวินาทีเศษส่วน
ตรวจสอบเสมอว่าระบบใช้ความละเอียดใดก่อนแปลง เนื่องจากการผสมกันอาจทำให้ได้วันที่ที่คลาดเคลื่อนไปหลายทศวรรษ
ปัญหา Year 2038
ปัญหา Year 2038 (หรือที่เรียกว่า "Unix Millennium Bug" หรือ "Y2K38") เป็นปัญหาการแสดงเวลาที่จะส่งผลต่อระบบที่เก็บ timestamp เป็น จำนวนเต็มแบบมีเครื่องหมาย 32 บิต
จำนวนเต็มแบบมีเครื่องหมาย 32 บิตสามารถเก็บค่าได้ตั้งแต่ประมาณ -2.1 พันล้านถึง +2.1 พันล้าน Unix timestamp สูงสุดที่แสดงได้คือ 2147483647 ซึ่งตรงกับ:
- 19 มกราคม 2038, 03:14:07 UTC
หนึ่งวินาทีต่อมา ค่าจะ overflow ไปเป็น -2147483648 ซึ่งแสดงถึง 13 ธันวาคม 1901 — ทำให้ระบบตีความเวลาปัจจุบันเป็นวันที่จากต้นศตวรรษที่ 20
ระบบใดบ้างที่ได้รับผลกระทบ?
- อุปกรณ์ฝังตัวและฮาร์ดแวร์ IoT ที่มีโปรเซสเซอร์ 32 บิต
- เคอร์เนล Linux แบบฝังตัวรุ่นเก่า
- ฐานข้อมูลรุ่นเก่าที่ใช้คอลัมน์เวลาจำนวนเต็ม 32 บิต
- ระบบไฟล์และรูปแบบไบนารีที่เก็บเวลาเป็นจำนวนเต็ม 32 บิต
การแก้ไข
ระบบสมัยใหม่ส่วนใหญ่ได้เปลี่ยนไปใช้ จำนวนเต็ม 64 บิต สำหรับการจัดเก็บเวลา จำนวนเต็มแบบมีเครื่องหมาย 64 บิตสามารถแสดงเวลาได้ถึงประมาณ 292 พันล้านปี ในอนาคต — ซึ่งแทบไม่มีที่สิ้นสุดสำหรับวัตถุประสงค์ในทางปฏิบัติใดๆ
- Linux distribution สมัยใหม่ส่วนใหญ่บนฮาร์ดแวร์ 64 บิตปลอดภัยแล้ว
- เคอร์เนล Linux ใช้ 64-bit time_t บนระบบ 64 บิตมาหลายปี
- เคอร์เนล 5.6+ เพิ่มการรองรับ 64-bit time_t สำหรับสถาปัตยกรรม 32 บิต
- ภาษาโปรแกรมเช่น Python, Go และ Java ใช้จำนวนเต็ม 64 บิตภายใน
หากคุณดูแลระบบฝังตัวหรือซอฟต์แวร์รุ่นเก่า การตรวจสอบขนาด time_t ของคุณเป็นสิ่งที่ควรทำในวันนี้
UTC และความสัมพันธ์กับ Unix Timestamp
Unix timestamp นั้น ไม่ขึ้นอยู่กับเขตเวลา โดยธรรมชาติ — พวกมันอ้างอิงถึง UTC เสมอ
UTC คืออะไร?
Coordinated Universal Time (UTC) คือมาตรฐานเวลาหลักที่โลกใช้ควบคุมนาฬิกาและเวลา มันแทนที่ Greenwich Mean Time (GMT) เป็นมาตรฐานสากลและรักษาไว้ด้วยนาฬิกาอะตอม
เหตุใด UTC จึงสำคัญสำหรับ Unix Timestamp
- Unix timestamp ถูกกำหนดใน UTC ดังนั้น timestamp จึงแสดงถึงช่วงเวลาเดียวกันทั่วโลก
- การแปลง Unix timestamp เป็นเวลาท้องถิ่นเป็นเรื่องของชั้นการแสดงผลเท่านั้น
- ไม่มีข้อมูลเขตเวลาถูกเก็บในตัว timestamp เอง ซึ่งทำให้ระบบเรียบง่ายและพกพาได้
การออกแบบนี้หมายความว่าคุณสามารถแชร์ Unix timestamp กับใครก็ได้ในโลกและทั้งสองฝ่ายสามารถแปลงเป็นเวลาท้องถิ่นของตนเองได้โดยไม่มีความคลุมเครือ
Leap Seconds: ข้อยกเว้นที่หายาก
ตามทฤษฎีแล้ว Unix timestamp นับวินาทีนับตั้งแต่ epoch แต่พวกมัน ละเลย leap seconds วันที่มีการเพิ่ม leap seconds ยังคงมี 86400 วินาทีใน Unix time ซึ่งหมายความว่าในระหว่าง leap seconds นั้น Unix timestamp จะไม่เดินหน้า และ leap seconds ก็หายไปจากการนับอย่างมีประสิทธิภาพ
การทำให้เรียบง่ายนี้ทำให้ระบบใช้งานได้จริง แต่หมายความว่า Unix timestamp จะคลาดเคลื่อนจากเวลาอะตอมเล็กน้อย ความคลาดเคลื่อนนี้น้อยพอที่จะแทบไม่มีความสำคัญสำหรับแอปพลิเคชันทั่วไป
ช่วง Timestamp ทั่วไป
| Timestamp | วันที่ที่มนุษย์อ่านได้ | ความสำคัญ | |-----------|---------------------|--------------| | 0 | 1970-01-01 00:00:00 UTC | Unix epoch | | 86400 | 1970-01-02 00:00:00 UTC | หนึ่งวันหลังจาก epoch | | 946684800 | 2000-01-01 00:00:00 UTC | ปี 2000 | | 1234567890 | 2009-02-13 23:31:30 UTC | รูปแบบที่น่าจดจำ | | 1785292800 | 2026-07-19 00:00:00 UTC | Epoch ของวันนี้ | | 2147483647 | 2038-01-19 03:14:07 UTC | ค่าสูงสุดของ 32 บิต |
สรุป
Unix timestamp เป็นวิธีที่สง่างามและพกพาได้ในการแสดงเวลาเป็นจำนวนเต็มเพียงหนึ่งเดียว การออกแบบของมัน — การนับวินาทีจาก 1 มกราคม 1970 UTC — ทำให้มันเป็นมาตรฐานเวลาสากลทั่วทั้งระบบปฏิบัติการ ฐานข้อมูล และภาษาโปรแกรม แม้ว่าปัญหา 2038 จะยังคุกคามระบบรุ่นเก่า แต่การเปลี่ยนผ่านไปสู่เวลา 64 บิตที่กำลังดำเนินอยู่ทำให้มั่นใจได้ว่า Unix timestamp จะยังคงเป็นรากฐานของการจัดการเวลาในคอมพิวเตอร์ต่อไปอีกหลายชั่วอายุคน
พร้อมที่จะทำงานกับ Unix timestamp แล้วหรือยัง? ใช้ Unix Timestamp Converter ของเราเพื่อแปลงระหว่าง timestamp และวันที่ที่มนุษย์อ่านได้ทันที