Date.UTC() คืออะไร
เมธอดสแตติก Date.UTC() ใช้สำหรับ สร้าง timestamp (มิลลิวินาทีจาก epoch) จากองค์ประกอบวันที่/เวลาในโซนเวลา UTC โดยตรง โดยไม่ต้องสร้าง Date object ก่อน
ต่างจาก new Date() หรือ Date.parse() ที่อาจตีความ input เป็น local time, Date.UTC() รับมั่นว่าค่าที่ส่งเข้าไปถูกตีความว่าเป็น UTC เสมอ
ไวยากรณ์ (Syntax)
Date.UTC(year, monthIndex[, day[, hours[, minutes[, seconds[, milliseconds]]]]])
year- ปี (เต็มรูปแบบ เช่น 2024, ไม่ใช่ 24)monthIndex- เดือน 0-11 (0 = มกราคม, 11 = ธันวาคม) ⚠️day(optional) - วันที่ 1-31 (default: 1)hours(optional) - ชั่วโมง 0-23 (default: 0)minutes(optional) - นาที 0-59 (default: 0)seconds(optional) - วินาที 0-59 (default: 0)milliseconds(optional) - มิลลิวินาที 0-999 (default: 0)
คืนค่า: จำนวนมิลลิวินาทีจาก epoch (UTC)
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การใช้งานพื้นฐาน
// 26 กันยายน 1989, 03:04:05 UTC
const timestamp = Date.UTC(1989, 8, 26, 3, 4, 5);
console.log(timestamp); // 622772645000
// สร้าง Date object จาก timestamp
const date = new Date(timestamp);
console.log(date.toUTCString()); // Tue, 26 Sep 1989 03:04:05 GMT
ตัวอย่างที่ 2: รับเฉพาะวันที่ (เวลาเป็น 00:00:00 UTC)
// 17 พฤศจิกายน 2018 UTC
const timestamp = Date.UTC(2018, 10, 17); // month 10 = November
console.log(timestamp); // 1542412800000
const date = new Date(timestamp);
console.log(date.toUTCString()); // Sat, 17 Nov 2018 00:00:00 GMT
ตัวอย่างที่ 3: การจัดการ Month Index (0-based)
// ❌ ผิด: คิดว่า month 1 = มกราคม
Date.UTC(2024, 1, 15); // 15 กุมภาพันธ์ 2024!
// ✅ ถูกต้อง: month 0 = มกราคม
Date.UTC(2024, 0, 15); // 15 มกราคม 2024
// ตัวช่วยแปลงเดือนปกติ (1-12) เป็น monthIndex (0-11)
function toMonthIndex(month) {
return month - 1;
}
Date.UTC(2024, toMonthIndex(1), 15); // 15 มกราคม 2024
ตัวอย่างที่ 4: การรองรับค่าที่ล้น (Overflow Handling)
// JavaScript จะปรับค่าอัตโนมัติ (rollover)
Date.UTC(2024, 12, 1); // month 12 = มกราคม 2025
Date.UTC(2024, 0, 32); // day 32 = 1 กุมภาพันธ์ 2024
Date.UTC(2024, 0, 0); // day 0 = 31 ธันวาคม 2023
Date.UTC(2024, -1, 1); // month -1 = ธันวาคม 2023
Date.UTC() vs new Date() vs Date.parse()
| เมธอด | Input | Timezone การตีความ | คืนค่า |
|---|---|---|---|
| Date.UTC() | Components (year, month, ...) | UTC เสมอ | Number (ms) |
| new Date() | Components / String | Local time (components) / Varies (string) | Date object |
| Date.parse() | String | Varies by format | Number (ms) |
กรณีการใช้งานทั่วไป
- สร้าง timestamp แบบ UTC โดยตรง ไม่ต้องกังวล timezone
- Database storage: เก็บ timestamp UTC เพื่อ consistency
- Cross-timezone scheduling: กำหนดเวลา meeting ระหว่างโซนเวลา
- Testing: สร้างวันที่คงที่สำหรับ unit tests
- API calls: ส่ง timestamp UTC ไป backend
ตัวอย่างการใช้งานจริง
สร้าง Event ในปฏิทิน (Calendar Event)
function createEventUTC(title, year, month, day, hour, minute, durationMinutes) {
const start = Date.UTC(year, month - 1, day, hour, minute);
const end = start + durationMinutes * 60 * 1000;
return {
title,
start: new Date(start),
end: new Date(end),
startTimestamp: start,
endTimestamp: end
};
}
const event = createEventUTC('Meeting', 2024, 1, 15, 14, 30, 60);
console.log(event.start.toUTCString()); // Mon, 15 Jan 2024 14:30:00 GMT
console.log(event.end.toUTCString()); // Mon, 15 Jan 2024 15:30:00 GMT
คำนวณเวลาต่างประเทศ
// เวลาในโซนเวลาต่างๆ สำหรับ event เดียวกัน
const eventUTC = Date.UTC(2024, 0, 15, 12, 0); // 15 Jan 2024 12:00 UTC
const timezones = {
'Bangkok': 7,
'Tokyo': 9,
'London': 0,
'New York': -5,
'Los Angeles': -8
};
for (const [city, offset] of Object.entries(timezones)) {
const localTime = new Date(eventUTC + offset * 3600 * 1000);
console.log(`${city}: ${localTime.toLocaleString()}`);
}
ข้อควรระวัง
- Month เป็น 0-based (0-11) - จุดที่ผิดพลาดบ่อยที่สุด
- Year ต้องเป็น 4 หลัก - 2 หลักจะถูกตีความว่า 1900+year
- คืนค่า
Number(ms) ไม่ใช่ Date object - ต้องnew Date()เอง - พารามิเตอร์ที่ข้ามไปจะใช้ค่า default (0 หรือ 1 สำหรับ day)
- ค่าที่ล้น (overflow) จะถูก normalize อัตโนมัติ