หากคุณเคยเจอตัวเลขแบบ 1717200000 และสงสัยว่ามันหมายถึงวันที่อะไร คุณไม่ได้เป็นคนเดียว การเรียนรู้การแปลง Unix timestamp เป็นวันที่เป็นทักษะพื้นฐานสำคัญสำหรับนักพัฒนาที่ทำงานกับ API ฐานข้อมูล และระบบ backend Unix timestamp คือการนับจำนวนวินาที (หรือมิลลิวินาที) ที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 เวลา 00:00:00 UTC ซึ่งเป็นจุดอ้างอิงที่เรียกว่า Unix epoch คู่มือนี้จะพาคุณทำความเข้าใจกลไกการแปลงวันที่และเวลา การจัดการ timezone และตัวอย่างโค้ดใน JavaScript, Python และ SQL เพื่อให้คุณหยุดเดาและเริ่มแปลงอย่างมั่นใจครับ
จุดสำคัญที่ควรจำ:
- Unix timestamp นับวินาทีจากวันที่ 1 มกราคม 1970 UTC (epoch 0) ทำให้เป็นค่าที่ไม่ขึ้นกับ timezone โดยธรรมชาติ
- ตรวจสอบให้แน่ใจเสมอว่า timestamp ของคุณเป็นหน่วยวินาทีหรือมิลลิวินาที เพราะการสับสนเป็นสาเหตุหลักของ bug
- การปรับ timezone ต้องทำหลังจากแปลงเป็น UTC แล้ว ไม่ใช่ก่อนหน้า
- JavaScript, Python และ SQL มีฟังก์ชันในตัวสำหรับแปลง Unix เป็นวันที่ แต่แต่ละภาษามีข้อควรระวังแตกต่างกัน
สารบัญ
Unix Timestamp คืออะไร?
Unix timestamp คือการแสดงช่วงเวลาหนึ่งในรูปแบบตัวเลขจำนวนเต็ม โดยเริ่มนับตั้งแต่วันที่ 1 มกราคม 1970 เวลา 00:00:00 UTC ซึ่งเรียกว่า "epoch 0" ทุกวินาทีที่ผ่านไปจะเพิ่มค่าขึ้นหนึ่ง ความเรียบง่ายนี้เองที่ทำให้มันกลายเป็นรูปแบบเวลามาตรฐานสากลสำหรับระบบคอมพิวเตอร์
ไม่มีเดือน ปีอธิกสุรทิน หรือการปรับเวลาออมแสงอยู่ในตัวเลขนั้นเอง Timestamp จะอยู่ในฐาน UTC เสมอ ซึ่งหมายความว่าตัวเลขเดียวกันจะหมายถึงช่วงเวลาเดียวกันไม่ว่าเซิร์ฟเวอร์หรือผู้ใช้จะอยู่ที่ไหน นี่คือทั้งจุดแข็งที่สุดและสาเหตุของความสับสนที่นักพัฒนาส่วนใหญ่พบเจอในการจัดการรูปแบบเวลาครับ
หากต้องการเจาะลึกเกี่ยวกับ epoch time ที่เป็นรากฐานของการคำนวณสมัยใหม่ ดูบทความของเราเรื่อง Epoch Time: รากฐานของ Unix Timestamps
จุดสำคัญอย่างหนึ่ง: Unix timestamp ไม่ได้นับเป็นวินาทีเสมอไป บางระบบ โดยเฉพาะ JavaScript และ REST API หลายตัว ใช้มิลลิวินาที Timestamp 1717200000 เป็นหน่วยวินาที ส่วน 1717200000000 คือช่วงเวลาเดียวกันแต่เป็นมิลลิวินาที การสับสนเรื่องนี้เป็น bug ที่พบบ่อยที่สุดในการแปลงวันที่และเวลา ก่อนเขียนโค้ดแม้แต่บรรทัดเดียว ให้ตรวจสอบหน่วยที่แหล่งข้อมูลใช้ก่อนครับ
ไม่แน่ใจว่าระบบของคุณควรใช้หน่วยไหน? ดูบทความ วินาที vs มิลลิวินาที vs ไมโครวินาที: ควรใช้ Unix Timestamp แบบไหน? สำหรับคำแนะนำเชิงปฏิบัติ
การจัดการ Timezone และ Bug ที่พบบ่อย
การแปลง Unix timestamp ตาม timezone เป็นจุดที่นักพัฒนาส่วนใหญ่พลาด Timestamp เองจะเป็น UTC เสมอ Timezone จะมีความสำคัญเฉพาะตอนแสดงผลหรือตีความ timestamp นั้นให้ผู้ใช้หรือ log entry การเข้าใจความแตกต่างนี้จะป้องกัน bug ทั้งหมวดหมู่ครับ
พื้นฐาน UTC
RFC 3339 กำหนดรูปแบบมาตรฐานสำหรับแสดง UTC datetime ในรูปแบบข้อความ (2024-06-01T00:00:00Z) เมื่อคุณแปลง Unix timestamp เป็นสตริงที่อ่านได้ คุณกำลังใช้ timezone offset กับฐาน UTC Offset บวกเช่น +05:30 (เวลามาตรฐานอินเดีย) จะบวกชั่วโมงและนาที ส่วน offset ลบเช่น -05:00 (เวลามาตรฐานตะวันออกของสหรัฐ) จะลบออก
การตรวจจับ Timezone อัตโนมัติ
ภาษาและเบราว์เซอร์สมัยใหม่ส่วนใหญ่สามารถตรวจจับ timezone ท้องถิ่นได้โดยอัตโนมัติ ใน JavaScript, Intl.DateTimeFormat().resolvedOptions().timeZone จะคืนค่าชื่อ IANA timezone (เช่น America/New_York) ใน Python โมดูล zoneinfo (Python 3.9+) จัดการ IANA zone ได้โดยตรง การพึ่งพาการตรวจจับอัตโนมัติใช้ได้สำหรับการแสดงผล แต่อย่าพึ่งพาสำหรับการจัดเก็บหรือคำนวณ timestamp
Bug เกี่ยวกับ Offset ที่พบบ่อย
- ถือว่าเวลาท้องถิ่นเป็น UTC: หากเซิร์ฟเวอร์ตั้งเป็น
UTC+2และคุณเรียกdatetime.now()โดยไม่ระบุ timezone คุณจะได้เวลาท้องถิ่นที่ดูเหมือน UTC แต่คลาดเคลื่อนสองชั่วโมง - การเปลี่ยนเวลาออมแสง (DST): Offset คงที่เช่น
+01:00ไม่คำนึงถึง DST ใช้ IANA zone ที่มีชื่อ (Europe/Berlin) แทน offset คงที่เมื่อเป็นไปได้ - การสับสนมิลลิวินาทีกับวินาที: การส่ง timestamp มิลลิวินาทีไปยังฟังก์ชันที่คาดหวังวินาทีจะให้วันที่ในปี 55000+ ตรวจสอบขนาดของตัวเลขก่อนเสมอ
- การตั้งค่า timezone ฐานข้อมูล: MySQL และ PostgreSQL สามารถจัดเก็บและแสดง timestamp แตกต่างกันขึ้นกับ session timezone จัดเก็บ timestamp เป็น UTC และแปลงในชั้น application
ตัวอย่างโค้ด: JavaScript, Python และ SQL
ตัวอย่างต่อไปนี้ครอบคลุมสถานการณ์ทั่วไปสำหรับการแปลง Unix เป็นวันที่ แต่ละตัวอย่างใช้ timestamp จริง: 1717200000 ซึ่งตรงกับวันที่ 1 มิถุนายน 2024 เวลา 00:00:00 UTC
JavaScript: แปลง Unix Timestamp
Object Date ของ JavaScript ทำงานเป็นมิลลิวินาที ดังนั้นคูณ timestamp ที่เป็นวินาทีด้วย 1000 ก่อนครับ
// JavaScript แปลง unix timestamp เป็นวันที่
const unixSeconds = 1717200000;
const date = new Date(unixSeconds * 1000); // แปลงเป็นมิลลิวินาที
// สตริง UTC
console.log(date.toUTCString());
// ผลลัพธ์: "Sat, 01 Jun 2024 00:00:00 GMT"
// แสดงตาม timezone ท้องถิ่น (ใช้ timezone ของเบราว์เซอร์/ระบบ)
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// ผลลัพธ์: "5/31/2024, 8:00:00 PM"
// รูปแบบ ISO 8601
console.log(date.toISOString());
// ผลลัพธ์: "2024-06-01T00:00:00.000Z"
สังเกตว่า timestamp เดียวกันแสดงเป็นวันที่ 31 พฤษภาคมในนิวยอร์ก เพราะเที่ยงคืน UTC คือ 8 โมงเย็นแถบตะวันออกของวันก่อนหน้า นี่ไม่ใช่ bug แต่เป็นพฤติกรรมการแปลง timezone ที่ถูกต้องครับ
Python: Unix Timestamp เป็น Datetime
โมดูล datetime ของ Python มีเมธอดที่ชัดเจนและสะอาด ใช้ datetime object ที่รู้จัก timezone ในโค้ดโปรดักชันเสมอครับ
from datetime import datetime, timezone
from zoneinfo import ZoneInfo # Python 3.9+
unix_seconds = 1717200000
# Python unix timestamp เป็น datetime (UTC)
dt_utc = datetime.fromtimestamp(unix_seconds, tz=timezone.utc)
print(dt_utc)
# ผลลัพธ์: 2024-06-01 00:00:00+00:00
# แปลงเป็น timezone เฉพาะ
dt_tokyo = dt_utc.astimezone(ZoneInfo("Asia/Tokyo"))
print(dt_tokyo)
# ผลลัพธ์: 2024-06-01 09:00:00+09:00
# จัดรูปแบบเป็นสตริงที่อ่านง่าย
print(dt_utc.strftime("%B %d, %Y at %H:%M UTC"))
# ผลลัพธ์: June 01, 2024 at 00:00 UTC
การใช้ datetime.fromtimestamp() โดยไม่มี argument tz จะคืนค่า datetime แบบ naive (ไม่รู้จัก timezone) ในเวลาระบบท้องถิ่น ซึ่งอาจทำให้เกิด bug แบบเงียบๆ ในสภาพแวดล้อมเซิร์ฟเวอร์ ให้ส่ง tz=timezone.utc เป็นนิสัยเสมอครับ
SQL: Epoch เป็น Datetime
ทั้ง PostgreSQL และ MySQL รองรับการแปลง epoch เป็น datetime โดยตรง
-- PostgreSQL: แปลง unix timestamp เป็นวันที่
SELECT TO_TIMESTAMP(1717200000) AS converted_date;
-- ผลลัพธ์: 2024-06-01 00:00:00+00
-- MySQL: การแปลง unix เป็นวันที่
SELECT FROM_UNIXTIME(1717200000) AS converted_date;
-- ผลลัพธ์: 2024-06-01 00:00:00
-- หมายเหตุ: FROM_UNIXTIME ใช้ session timezone ตั้งค่าให้ชัดเจน:
SET time_zone = '+00:00';
SELECT FROM_UNIXTIME(1717200000);
สำหรับคำแนะนำเชิงลึกเกี่ยวกับการจัดเก็บและ query timestamp ในฐานข้อมูล ดู Unix Timestamps ในฐานข้อมูล: Best Practices สำหรับการจัดเก็บและ Query
กรณีการใช้งานจริง: การแปลง epoch เป็น datetime ในระบบจริง
การเข้าใจกลไกเป็นเรื่องหนึ่ง การเห็นว่าการแปลง epoch เป็น datetime ทำงานในระบบจริงอย่างไรจะทำให้เข้าใจแน่นขึ้น นี่คือสามสถานการณ์จริงจากรูปแบบการพัฒนา SaaS ทั่วไปครับ
กรณีศึกษา: การ Parse REST API, การจัดเก็บฐานข้อมูล และ Backend Logging
ลองจินตนาการแพลตฟอร์มวิเคราะห์ SaaS ที่รับข้อมูล event จาก REST API ของบุคคลที่สาม แต่ละ API response มีฟิลด์เช่น "event_time": 1717200000 นี่คือวิธีที่ทีมจัดการในแต่ละชั้น:
1. การ Parse REST API
Backend service รับ JSON payload และตรวจสอบหน่วย timestamp ทันที เพราะค่ามี 10 หลัก ทีมจึงยืนยันว่าเป็นวินาที (13 หลักจะบ่งบอกมิลลิวินาที) Python service แปลงเป็น UTC-aware datetime object ก่อนการประมวลผลเพิ่มเติม เพื่อให้แน่ใจว่าฟังก์ชันปลายทางจะไม่ได้รับตัวเลขดิบโดยบังเอิญ
2. การจัดเก็บฐานข้อมูล
แพลตฟอร์มจัดเก็บค่าในคอลัมน์ PostgreSQL ที่เป็นประเภท TIMESTAMPTZ (timestamp with time zone) Application จะ insert ใน UTC เสมอโดยใช้ TO_TIMESTAMP(1717200000) การจัดเก็บใน UTC หมายความว่าเมื่อบริษัทขยายไปให้บริการผู้ใช้ในหลายภูมิภาค ไม่ต้อง migrate ข้อมูล Query จะกรองใน UTC เสมอและแปลงเป็นเวลาท้องถิ่นเฉพาะในชั้น presentation เท่านั้น
3. Backend Logging
Pipeline การ log แนบสตริง ISO 8601 UTC (2024-06-01T00:00:00Z) ใน log entry ทุกรายการควบคู่กับ Unix timestamp ดิบ วิธีการคู่นี้ทำให้วิศวกรอ่าน log ได้โดยตรงโดยไม่ต้องใช้เครื่องมือแปลง ในขณะที่ระบบตรวจสอบอัตโนมัติยังสามารถทำการคำนวณที่แม่นยำกับค่าตัวเลขได้ เมื่อมี bug report ว่า "เกิดข้อผิดพลาดประมาณ 9 โมงเช้าเวลาโตเกียว" ทีมจะแปลงเป็นช่วง Unix timestamp และ query log โดยตรง
รูปแบบสามชั้นนี้ (parse, เก็บใน UTC, แสดงแบบท้องถิ่น) เป็นวิธีที่สะอาดที่สุดสำหรับจัดการการแปลงวันที่และเวลาในระบบโปรดักชันใดๆ ครับ
เทคนิคด่วน: หากคุณทำงานกับ Discord bot หรือ community server, Unix timestamp ยังขับเคลื่อนการจัดรูปแบบ timestamp ดั้งเดิมของ Discord ด้วย เรียนรู้วิธีการในคู่มือ Discord Timestamps ทำงานอย่างไรและวิธีใช้ในเซิร์ฟเวอร์ของคุณ
สรุป
การแปลง Unix timestamp เป็นวันที่ที่อ่านได้เป็นเรื่องตรงไปตรงมาเมื่อคุณเข้าใจกฎสามข้อ: timestamp เป็น UTC เสมอ หน่วยจะเป็นวินาทีหรือมิลลิวินาที (ตรวจสอบก่อนแปลง) และการปรับ timezone ใช้ในเวลาแสดงผล ไม่ใช่เวลาจัดเก็บ ไม่ว่าคุณจะเขียน JavaScript, Python หรือ SQL เครื่องมือในตัวจะเชื่อถือได้ตдо่างคุณใช้กับ timezone argument ที่ชัดเจน ใช้รูปแบบสามชั้นจากกรณีศึกษาข้างต้น (parse, เก็บใน UTC, แสดงแบบท้องถิ่น) แล้วคุณจะหลีกเลี่ยงข้อผิดพลาดทั่วไปในการแปลงวันที่และเวลาในระบบ SaaS ใดๆ ได้ครับ
แปลง Unix Timestamp ใดๆ ได้ทันที
วาง timestamp ใดๆ แล้วรับวันที่ UTC ที่แม่นยำ เวลาท้องถิ่น และรายละเอียด timezone ในคลิกเดียว ไม่ต้องติดตั้ง ไม่ต้องสมัครสมาชิก
ลองใช้เครื่องมือฟรีที่ unixtimestamp.app →
Timestamp เป็นวินาทีจะเป็นตัวเลข 10 หลัก (สำหรับวันที่ราวๆ ปี 2026) ส่วน timestamp เป็นมิลลิวินาทีจะเป็น 13 หลัก Object Date ของ JavaScript ใช้มิลลิวินาทีโดยธรรมชาติ หากต้องแปลง timestamp วินาทีใน JavaScript ให้คูณด้วย 1000 ก่อนส่งไปยัง new Date() การสับสนสองหน่วยนี้เป็นสาเหตุที่พบบ่อยที่สุดของวันที่ที่ผิดพลาดอย่างมากครับ
นี่เป็นพฤติกรรมที่คาดหวัง ไม่ใช่ bug Unix timestamp แสดงช่วงเวลา UTC หากเที่ยงคืน UTC ตรงกับวันก่อนหน้าใน timezone ของคุณ (เช่น UTC 00:00 คือ 8 โมงเย็นแถบตะวันออกของวันก่อน) วันที่ที่แสดงจะแตกต่างกัน ระบุ timezone เป้าหมายให้ชัดเจนเสมอเมื่อจัดรูปแบบสำหรับการแสดงผลครับ
ใช้ datetime.fromtimestamp(ts, tz=timezone.utc) จากโมดูล datetime ครับ จะคืนค่า timezone-aware UTC datetime object หลีกเลี่ยงการเรียก datetime.fromtimestamp() โดยไม่มี argument tz เพราะจะใช้ timezone ระบบท้องถิ่นและสร้าง naive datetime ที่อาจทำให้เกิดข้อผิดพลาดแบบเงียบๆ ในสภาพแวดล้อมเซิร์ฟเวอร์
เก็บ timestamp เป็น TIMESTAMPTZ (PostgreSQL) หรือเป็นจำนวนเต็ม UTC ครับ หลีกเลี่ยงการเก็บสตริงที่จัดรูปแบบแล้วเช่น "1 มิถุนายน 2024" เพราะ query, sort และเปรียบเทียบยาก แปลงเป็นรูปแบบที่อ่านได้เฉพาะในชั้น application หรือ presentation เท่านั้น เพื่อให้ฐานข้อมูลเป็นกลางต่อ timezone และพกพาได้
Unix epoch ของวันที่ 1 มกราคม 1970 ถูกเลือกโดยนักพัฒนา Unix ยุคแรกเป็นจุดอ้างอิงที่สะดวกและใกล้เคียง ไม่ใช่ข้อกำหนดทางเทคนิคแต่เป็นการตัดสินใจเชิงปฏิบัติที่ทำในช่วงต้นทศวรรษ 1970 ตอนที่ Unix กำลังถูกพัฒนาที่ Bell Labs วันที่นี้กลายเป็นมาตรฐานสากลสำหรับการวัดเวลาคอมพิวเตอร์มาตั้งแต่นั้นครับ