Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ฟังก์ชัน Date.UTC() ใน JavaScript

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()

เมธอดInputTimezone การตีความคืนค่า
Date.UTC()Components (year, month, ...)UTC เสมอNumber (ms)
new Date()Components / StringLocal time (components) / Varies (string)Date object
Date.parse()StringVaries by formatNumber (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 อัตโนมัติ