ตัวแปลง Unix Timestamp
วันที่และเวลาที่แปลงแล้ว
ยูนิกซ์ ไทม์สแตมป์ คอนเวอร์เตอร์
บทนำ
ยูนิกซ์ไทมป์สแตมป์ (Unix timestamp) (หรือที่เรียกว่า POSIX time หรือ Epoch time) เป็นระบบสำหรับการอธิบายจุดในเวลา มันคือจำนวนวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 (เที่ยงคืน UTC/GMT) โดยไม่คำนึงถึงวินาทีที่มีการเพิ่ม (leap seconds) ยูนิกซ์ไทมป์สแตมป์ถูกใช้กันอย่างแพร่หลายในระบบคอมพิวเตอร์และภาษาการเขียนโปรแกรมเนื่องจากมันให้การแทนที่เฉพาะจุดในเวลาในรูปแบบที่กระชับและไม่ขึ้นกับภาษา
ตัวแปลงนี้ช่วยให้คุณสามารถแปลงยูนิกซ์ไทมป์สแตมป์ให้เป็นวันที่และเวลาที่อ่านได้ในรูปแบบที่เข้าใจง่าย มันรองรับทั้งรูปแบบเวลา 12 ชั่วโมง (AM/PM) และ 24 ชั่วโมงเพื่อรองรับความชอบในระดับภูมิภาคและส่วนบุคคลที่แตกต่างกัน
วิธีการทำงานของยูนิกซ์ไทมป์สแตมป์
ยูนิกซ์ไทมป์สแตมป์ถูกคำนวณเป็นจำนวนวินาทีตั้งแต่ยูนิกซ์อีพอช (Unix Epoch) (วันที่ 1 มกราคม 1970, 00:00:00 UTC) ซึ่งทำให้มันมีประโยชน์โดยเฉพาะสำหรับการคำนวณความแตกต่างของเวลาและสำหรับการจัดเก็บวันที่ในรูปแบบที่กระชับ
สูตรการแปลงจากยูนิกซ์ไทมป์สแตมป์ไปยังวันที่ในปฏิทินประกอบด้วยหลายขั้นตอน:
- เริ่มต้นด้วยยูนิกซ์อีพอช (วันที่ 1 มกราคม 1970, 00:00:00 UTC)
- เพิ่มจำนวนวินาทีในไทป์สแตมป์
- คำนึงถึงปีอธิก (leap years), ความยาวเดือนที่แตกต่างกัน, และความซับซ้อนอื่น ๆ ของปฏิทิน
- ใช้การปรับเวลาเขตถ้าจำเป็น
ตัวอย่างเช่น ยูนิกซ์ไทมป์สแตมป์ 1609459200
แทนวันศุกร์ที่ 1 มกราคม 2021, 00:00:00 UTC
สูตรการแปลงสามารถแสดงได้ดังนี้:
ภาษาการเขียนโปรแกรมและระบบปฏิบัติการส่วนใหญ่มีฟังก์ชันในตัวเพื่อจัดการการแปลงนี้ โดยทำให้การคำนวณปฏิทินที่ซับซ้อนกลายเป็นเรื่องง่าย
ตัวเลือกฟอร์แมตเวลา
ตัวแปลงนี้มีตัวเลือกฟอร์แมตเวลาสองแบบ:
-
ฟอร์แมต 24 ชั่วโมง (บางครั้งเรียกว่า "เวลาแบบทหาร"): ชั่วโมงจะอยู่ในช่วง 0 ถึง 23 และไม่มีการระบุ AM/PM ตัวอย่างเช่น 15:00 แทนเวลา 3:00 PM
-
ฟอร์แมต 12 ชั่วโมง: ชั่วโมงจะอยู่ในช่วง 1 ถึง 12 โดยมี AM (ante meridiem) สำหรับเวลาตั้งแต่เที่ยงคืนถึงเที่ยงวัน และ PM (post meridiem) สำหรับเวลาตั้งแต่เที่ยงวันถึงเที่ยงคืน ตัวอย่างเช่น 15:00 ในฟอร์แมต 24 ชั่วโมงจะแทนที่เวลา 3:00 PM
การเลือกระหว่างฟอร์แมตเหล่านี้ส่วนใหญ่เป็นเรื่องของธรรมเนียมในระดับภูมิภาคและความชอบส่วนบุคคล:
- ฟอร์แมต 24 ชั่วโมงใช้กันทั่วไปในยุโรป, ละตินอเมริกา, และเอเชีย รวมถึงในบริบททางวิทยาศาสตร์, ทหาร, และการแพทย์ทั่วโลก
- ฟอร์แมต 12 ชั่วโมงเป็นที่นิยมในสหรัฐอเมริกา, แคนาดา, ออสเตรเลีย, และบางประเทศที่พูดภาษาอังกฤษสำหรับการใช้งานในชีวิตประจำวัน
ข้อพิจารณาและข้อจำกัด
เมื่อทำงานกับยูนิกซ์ไทมป์สแตมป์ สิ่งสำคัญคือต้องตระหนักถึงหลายกรณีขอบเขตและข้อจำกัด:
-
ไทป์สแตมป์เชิงลบ: แทนวันที่ก่อนยูนิกซ์อีพอช (วันที่ 1 มกราคม 1970) แม้ว่าจะถูกต้องทางคณิตศาสตร์ แต่บางระบบอาจไม่จัดการไทป์สแตมป์เชิงลบอย่างถูกต้อง
-
ปัญหาปี 2038: ยูนิกซ์ไทมป์สแตมป์มักถูกจัดเก็บเป็นจำนวนเต็ม 32 บิตที่มีเครื่องหมาย ซึ่งจะเกินขีดจำกัดในวันที่ 19 มกราคม 2038 หลังจากจุดนี้ ระบบ 32 บิตจะไม่สามารถแทนเวลาที่ถูกต้องได้ เว้นแต่จะมีการปรับปรุงเพื่อใช้ประเภทจำนวนเต็มที่ใหญ่กว่า
-
ไทป์สแตมป์ที่มีขนาดใหญ่มาก: วันที่ในอนาคตที่ไกลมากอาจไม่สามารถแทนได้ในบางระบบ หรืออาจถูกจัดการอย่างไม่สอดคล้องกัน
-
วินาทีอธิก: ยูนิกซ์เวลาไม่คำนึงถึงวินาทีอธิก ซึ่งถูกเพิ่มเข้ามาใน UTC เพื่อชดเชยการหมุนที่ไม่สม่ำเสมอของโลก ซึ่งหมายความว่ายูนิกซ์เวลาไม่ถูกซิงโครไนซ์อย่างแม่นยำกับเวลาเชิงดาราศาสตร์
-
การพิจารณาเขตเวลา: ยูนิกซ์ไทมป์สแตมป์แทนช่วงเวลาใน UTC การแปลงเป็นเวลาท้องถิ่นต้องการข้อมูลเขตเวลาเพิ่มเติม
-
เวลาออมแสง: เมื่อแปลงไทป์สแตมป์เป็นเวลาท้องถิ่น ความซับซ้อนของการเปลี่ยนแปลงเวลาออมแสงต้องถูกพิจารณา
กรณีการใช้งาน
ยูนิกซ์ไทมป์สแตมป์ถูกใช้ในหลายแอปพลิเคชันทั่วทั้งการประมวลผลและการจัดการข้อมูล:
-
บันทึกในฐานข้อมูล: ไทป์สแตมป์มักถูกใช้เพื่อบันทึกเมื่อมีการสร้างหรือแก้ไขรายการ
-
การพัฒนาเว็บ: HTTP headers, cookies, และกลไกการแคชมักใช้ยูนิกซ์ไทมป์สแตมป์
-
ไฟล์บันทึก: บันทึกระบบมักบันทึกเหตุการณ์ด้วยยูนิกซ์ไทมป์สแตมป์เพื่อให้การจัดลำดับเวลาอย่างแม่นยำ
-
ระบบควบคุมเวอร์ชัน: Git และระบบ VCS อื่น ๆ ใช้ไทป์สแตมป์เพื่อบันทึกเมื่อมีการทำ commit
-
การตอบสนอง API: API เว็บหลายแห่งรวมไทป์สแตมป์ในคำตอบของพวกเขาเพื่อบ่งชี้ว่าเมื่อใดที่ข้อมูลถูกสร้างขึ้นหรือเมื่อทรัพยากรถูกแก้ไขล่าสุด
-
ระบบไฟล์: เวลาในการสร้างและแก้ไขไฟล์มักถูกจัดเก็บเป็นยูนิกซ์ไทมป์สแตมป์
-
การจัดการเซสชัน: แอปพลิเคชันเว็บใช้ไทป์สแตมป์เพื่อตัดสินใจว่าเมื่อใดที่เซสชันของผู้ใช้ควรหมดอายุ
-
การวิเคราะห์ข้อมูล: ไทป์สแตมป์ให้วิธีการมาตรฐานในการทำงานกับข้อมูลเชิงเวลาในแอปพลิเคชันการวิเคราะห์
ทางเลือก
แม้ว่ายูนิกซ์ไทมป์สแตมป์จะถูกใช้กันอย่างแพร่หลาย แต่ก็มีรูปแบบการแทนที่เวลาอื่น ๆ ที่อาจเหมาะสมกว่าในบางบริบท:
-
ISO 8601: รูปแบบสตริงมาตรฐาน (เช่น "2021-01-01T00:00:00Z") ที่อ่านได้ง่ายในขณะที่ยังคงสามารถเรียงลำดับได้ มักจะถูกเลือกใช้สำหรับการแลกเปลี่ยนข้อมูลและแอปพลิเคชันที่มีการแสดงผลต่อผู้ใช้
-
RFC 3339: โปรไฟล์ของ ISO 8601 ที่ใช้ในโปรโตคอลอินเทอร์เน็ต โดยมีข้อกำหนดการจัดรูปแบบที่เข้มงวดกว่า
-
รูปแบบที่อ่านได้ง่าย: สตริงวันที่ที่มีการระบุในท้องถิ่น (เช่น "1 มกราคม 2021") เหมาะสำหรับการโต้ตอบกับผู้ใช้โดยตรง แต่ไม่เหมาะสำหรับการคำนวณ
-
Microsoft FILETIME: ค่าที่มีขนาด 64 บิตที่แทนจำนวนช่วงเวลา 100 นาโนวินาทีตั้งแต่วันที่ 1 มกราคม 1601 ใช้ในระบบ Windows
-
หมายเลขวันจูเลียน: ใช้ในดาราศาสตร์และแอปพลิเคชันทางวิทยาศาสตร์บางอย่าง โดยนับวันตั้งแต่วันที่ 1 มกราคม 4713 ก่อนคริสต์ศักราช
การเลือกใช้รูปแบบเวลา ขึ้นอยู่กับปัจจัยต่าง ๆ เช่น:
- ความแม่นยำที่ต้องการ
- ความต้องการในการอ่านของมนุษย์
- ข้อจำกัดในการจัดเก็บ
- ความเข้ากันได้กับระบบที่มีอยู่
- ช่วงวันที่ที่ต้องการแทนที่
ประวัติศาสตร์
แนวคิดของเวลาแบบยูนิกซ์เกิดขึ้นจากการพัฒนาระบบปฏิบัติการยูนิกซ์ที่ Bell Labs ในช่วงปลายทศวรรษ 1960 และต้นทศวรรษ 1970 การตัดสินใจใช้วันที่ 1 มกราคม 1970 เป็นอีพอชนั้นค่อนข้างจะเป็นการเลือกที่สุ่ม แต่ก็มีความเหมาะสมในขณะนั้น—มันเป็นวันที่ใกล้เคียงพอที่จะลดความต้องการในการจัดเก็บสำหรับวันที่ที่น่าสนใจ แต่ก็ห่างไกลพอที่จะมีประโยชน์สำหรับข้อมูลทางประวัติศาสตร์
การใช้งานเดิมใช้จำนวนเต็ม 32 บิตที่มีเครื่องหมายเพื่อจัดเก็บจำนวนวินาที ซึ่งเพียงพอสำหรับอายุการใช้งานที่คาดการณ์ไว้ของระบบยูนิกซ์ในขณะนั้น อย่างไรก็ตาม การตัดสินใจนี้นำไปสู่ปัญหาปี 2038 (บางครั้งเรียกว่า "Y2K38" หรือ "Unix Millennium Bug") เนื่องจากจำนวนเต็ม 32 บิตสามารถแทนวันที่ได้สูงสุดจนถึงวันที่ 19 มกราคม 2038 (03:14:07 UTC)
เมื่อยูนิกซ์และระบบที่คล้ายกันได้รับความนิยม ยูนิกซ์ไทมป์สแตมป์จึงกลายเป็นมาตรฐานที่ไม่เป็นทางการในการแทนที่เวลาในคอมพิวเตอร์ มันถูกนำไปใช้โดยภาษาการเขียนโปรแกรม, ฐานข้อมูล, และแอปพลิเคชันจำนวนมาก ซึ่งขยายออกไปไกลกว่าบริบทยูนิกซ์เดิม
ระบบสมัยใหม่เริ่มใช้จำนวนเต็ม 64 บิตสำหรับไทป์สแตมป์ ซึ่งขยายช่วงที่สามารถแทนได้ประมาณ 292 พันล้านปีในทั้งสองทิศทางจากอีพอช ซึ่งแก้ไขปัญหาปี 2038 อย่างมีประสิทธิภาพ อย่างไรก็ตาม ระบบและแอปพลิเคชันที่เก่าแก่ยังคงอาจมีความเสี่ยง
ความเรียบง่ายและความมีประโยชน์ของยูนิกซ์ไทมป์สแตมป์ทำให้มันยังคงมีความเกี่ยวข้องแม้จะมีการพัฒนารูปแบบการแทนที่เวลาที่ซับซ้อนมากขึ้น มันยังคงเป็นแนวคิดพื้นฐานในการประมวลผลคอมพิวเตอร์ ซึ่งเป็นรากฐานของโครงสร้างพื้นฐานดิจิทัลของเรา
ตัวอย่างโค้ด
นี่คือตัวอย่างของการแปลงยูนิกซ์ไทมป์สแตมป์เป็นวันที่ที่อ่านได้ในภาษาการเขียนโปรแกรมต่าง ๆ:
// การแปลงไทป์สแตมป์ใน JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
// สร้างวัตถุ Date ใหม่ (JavaScript ใช้หน่วยมิลลิวินาที)
const date = new Date(timestamp * 1000);
// ตัวเลือกการจัดรูปแบบ
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
// แปลงเป็นสตริงโดยใช้การจัดรูปแบบตามภูมิภาค
return date.toLocaleString(undefined, options);
}
// การใช้งานตัวอย่าง
const timestamp = 1609459200; // วันที่ 1 มกราคม 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // ฟอร์แมต 24 ชั่วโมง
console.log(convertUnixTimestamp(timestamp, true)); // ฟอร์แมต 12 ชั่วโมง
การจัดการกรณีขอบเขต
เมื่อทำงานกับยูนิกซ์ไทมป์สแตมป์ สิ่งสำคัญคือต้องจัดการกรณีขอบเขตอย่างถูกต้อง นี่คือตัวอย่างการจัดการกรณีขอบเขตทั่วไป:
// การจัดการกรณีขอบเขตใน JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
// ตรวจสอบว่าไทป์สแตมป์ถูกต้องหรือไม่
if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
return "ไทป์สแตมป์ไม่ถูกต้อง";
}
// ตรวจสอบไทป์สแตมป์เชิงลบ (วันที่ก่อนปี 1970)
if (timestamp < 0) {
// บางเบราว์เซอร์อาจไม่จัดการไทป์สแตมป์เชิงลบอย่างถูกต้อง
// ใช้วิธีที่มีความแข็งแกร่งมากขึ้นสำหรับวันที่ก่อนปี 1970
const date = new Date(timestamp * 1000);
if (isNaN(date.getTime())) {
return "วันที่ไม่ถูกต้อง (ก่อนปี 1970)";
}
}
// ตรวจสอบปัญหา Y2K38 (สำหรับระบบ 32 บิต)
const maxInt32 = 2147483647; // ค่าสูงสุดสำหรับจำนวนเต็ม 32 บิตที่มีเครื่องหมาย
if (timestamp > maxInt32) {
// พิจารณาใช้ BigInt สำหรับไทป์สแตมป์ที่มีขนาดใหญ่ใน JavaScript สมัยใหม่
console.warn("ไทป์สแตมป์เกินขีดจำกัดของจำนวนเต็ม 32 บิต (ปัญหา Y2K38)");
}
// ดำเนินการแปลงตามปกติ
try {
const date = new Date(timestamp * 1000);
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
return date.toLocaleString(undefined, options);
} catch (error) {
return "เกิดข้อผิดพลาดในการแปลงไทป์สแตมป์: " + error.message;
}
}
อ้างอิง
-
"Unix Time." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time
-
"Year 2038 Problem." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem
-
Olson, Arthur David. "The Complexities of Calendrical Time." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf
-
"ISO 8601." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/ISO_8601
-
"RFC 3339: Date and Time on the Internet: Timestamps." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339
-
Kernighan, Brian W., and Dennis M. Ritchie. "The C Programming Language." Prentice Hall, 1988.