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

ดึง Unix Timestamp จาก String โดยไม่ตั้งค่า Default Timezone ใน PHP

เมื่อ String เวลามี Timezone ระบุอยู่แล้ว (เช่น "America/Los_Angeles") PHP จะแปลงเป็น Timestamp ได้ถูกต้องโดยอัตโนมัติ ไม่ต้องตั้งค่า date_default_timezone_set() ก่อน

ตรวจสอบ Default Timezone ปัจจุบัน

echo date_default_timezone_get(); // ผลลัพธ์: UTC (หรือ timezone ที่ตั้งค่าไว้)

แปลง String ที่มี Timezone เป็น Timestamp

$dateString = "1/1/2020 00:00:00 America/Los_Angeles";
$timestamp = strtotime($dateString);
echo date("Y-m-d H:i:s", $timestamp); // 2020-01-01 08:00:00 (UTC)

คำอธิบาย: เวลา 00:00 ใน Los Angeles (PST/UTC-8) เทียบเท่ากับ 08:00 UTC ของวันเดียวกัน

แปลง String ที่ไม่มี Timezone (ใช้ Default Timezone)

$dateString = "1/1/2020 00:00:00"; // ไม่มี timezone
$timestamp = strtotime($dateString);
echo date("Y-m-d H:i:s", $timestamp); // 2020-01-01 00:00:00 (ใน Default Timezone)

แปลงเป็น Timestamp โดยตรง

$timestamp = strtotime("1/1/2020 00:00:00 America/Los_Angeles");
echo $timestamp; // 1577923200 (Unix Timestamp)

แปลง Timestamp กลับเป็น String ใน Timezone ที่ต้องการ

$timestamp = 1577923200;
// แสดงใน Timezone ต่างๆ
date_default_timezone_set('UTC');
echo date("Y-m-d H:i:s", $timestamp); // 2020-01-01 08:00:00

date_default_timezone_set('America/Los_Angeles');
echo date("Y-m-d H:i:s", $timestamp); // 2020-01-01 00:00:00

date_default_timezone_set('Asia/Bangkok');
echo date("Y-m-d H:i:s", $timestamp); // 2020-01-01 15:00:00

แนวทางปฏิบัติที่ดี (Best Practice)

  1. เก็บเวลาใน Database เป็น UTC เสมอ (Timestamp หรือ DATETIME UTC)
  2. แปลงแสดงผลใน Timezone ของ User เท่านั้นตอนแสดงผล
  3. ใช้ DateTime และ DateTimeZone คลาสแทนฟังก์ชันเก่า สำหรับโค้ดใหม่
// แนะนำ: ใช้ DateTime (PHP 5.2+)
$dt = new DateTime("1/1/2020 00:00:00", new DateTimeZone("America/Los_Angeles"));
echo $dt->getTimestamp(); // 1577923200

// แปลงแสดงใน Timezone อื่น
$dt->setTimezone(new DateTimeZone("Asia/Bangkok"));
echo $dt->format("Y-m-d H:i:s"); // 2020-01-01 15:00:00