0Pricing
PHP Academy · บทเรียน

เขตเวลาใน PHP

จัดการหลายเขตเวลาด้วย DateTimeZone และ date_default_timezone_set

เขตเวลาใน PHP เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดเขตเวลาจึงสำคัญ

หากแอปพลิเคชันของคุณให้บริการผู้ใช้ทั่วโลก การจัดการเขตเวลาถือเป็นเรื่องสำคัญอย่างยิ่ง PHP ใช้ฟังก์ชันและคลาสที่รองรับเขตเวลาเพื่อจัดการการแปลงค่าอย่างถูกต้อง

  • จัดเก็บเวลาในฐานข้อมูลเป็น UTC เสมอ
  • แปลงเป็นเขตเวลาท้องถิ่นของผู้ใช้เฉพาะเมื่อต้องแสดงผล

date_default_timezone_set()

กำหนดเขตเวลาเริ่มต้นสำหรับฟังก์ชันวันที่ทั้งหมด:

<?php
// Set at the top of your script or in php.ini
date_default_timezone_set('Europe/Istanbul');

echo date('Y-m-d H:i:s');  // local Istanbul time
echo PHP_EOL;

date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s');  // UTC time

// Or set in php.ini:
// date.timezone = "Europe/London"

คลาส DateTimeZone

สร้างออบเจ็กต์เขตเวลาเพื่อใช้กับ DateTime:

<?php
$utc      = new DateTimeZone('UTC');
$istanbul = new DateTimeZone('Europe/Istanbul');
$ny       = new DateTimeZone('America/New_York');

$dt = new DateTime('now', $utc);
echo $dt->format('Y-m-d H:i:s T');  // UTC time

การแปลงระหว่างเขตเวลา

แปลง DateTime เป็นเขตเวลาอื่นด้วย setTimezone():

<?php
$utcTime = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));

$istanbul = clone $utcTime;
$istanbul->setTimezone(new DateTimeZone('Europe/Istanbul'));

$newYork = clone $utcTime;
$newYork->setTimezone(new DateTimeZone('America/New_York'));

echo 'UTC:      ' . $utcTime->format('H:i T')  . PHP_EOL;
echo 'Istanbul: ' . $istanbul->format('H:i T') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i T')  . PHP_EOL;

getOffset() และ DST

รับค่าออฟเซ็ต UTC เป็นวินาทีและตรวจสอบ DST:

<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);

$offset = $tz->getOffset($dt);        // offset in seconds
$offsetHours = $offset / 3600;
echo 'Offset: ' . $offsetHours . 'h'; // e.g. -5 or -4 in DST

$transitions = $tz->getTransitions(
    strtotime('2024-01-01'),
    strtotime('2024-12-31')
);
echo 'DST changes in 2024: ' . count($transitions);

จัดเก็บเป็น UTC และแสดงผลตามเวลาท้องถิ่น

แนวปฏิบัติที่ดีที่สุดคือจัดเก็บ UTC ในฐานข้อมูล และแสดงเวลาท้องถิ่นแก่ผู้ใช้:

<?php
// Store: always save as UTC
$createdAt = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
    ->format('Y-m-d H:i:s');

// Display: convert to user's timezone
$userTz  = new DateTimeZone($user['timezone'] ?? 'UTC');
$display = (new DateTime($createdAt, new DateTimeZone('UTC')))
    ->setTimezone($userTz)
    ->format('d M Y, H:i T');

การตรวจหาเขตเวลาของผู้ใช้

ตรวจหาและจัดเก็บเขตเวลาของผู้ใช้เพื่อใช้ในการแสดงผล:

// JavaScript: detect and send to PHP:
// const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
// fetch('/api/set-timezone', { method:'POST', body: tz });

<?php
// PHP: validate and store
$tz = $_POST['timezone'] ?? 'UTC';
$valid = in_array($tz, DateTimeZone::listIdentifiers());

if ($valid) {
    $_SESSION['timezone'] = $tz;
    setcookie('user_tz', $tz, time() + 365 * 86400);
}

DateTimeZone::listIdentifiers()

รับตัวระบุเขตเวลาที่ถูกต้องทั้งหมด:

<?php
// All identifiers
$all = DateTimeZone::listIdentifiers();
echo count($all) . ' timezones available';

// Filter by region
$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
echo count($europe) . ' European timezones';

// Check if a timezone string is valid
function isValidTimezone(string $tz): bool {
    return in_array($tz, DateTimeZone::listIdentifiers());
}
var_dump(isValidTimezone('Europe/Istanbul')); // true

การจัดรูปแบบออฟเซ็ตเขตเวลา

จัดรูปแบบออฟเซ็ตเขตเวลาสำหรับการแสดงผลและส่วนติดต่อโปรแกรมประยุกต์:

<?php
$dt = new DateTime('now', new DateTimeZone('America/Los_Angeles'));

echo $dt->format('P');     // +05:30 or -07:00
echo $dt->format('O');     // +0530 (no colon)
echo $dt->format('T');     // PST or PDT
echo $dt->format('e');     // America/Los_Angeles
echo $dt->format('Z');     // offset in seconds

การประทับเวลาแบบยูนิกซ์ไม่ขึ้นกับเขตเวลา

การประทับเวลาแบบยูนิกซ์แทนช่วงเวลาหนึ่งโดยเฉพาะโดยไม่ขึ้นกับเขตเวลา — ใช้สำหรับการเปรียบเทียบและการคำนวณ:

<?php
// These represent the same moment:
$utc   = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$ist   = new DateTime('2024-05-27 15:00:00', new DateTimeZone('Asia/Kolkata'));

echo $utc->getTimestamp();   // same timestamp
echo $ist->getTimestamp();   // same timestamp

var_dump($utc->getTimestamp() === $ist->getTimestamp()); // true

date_create พร้อมเขตเวลา

จัดการเขตเวลาในรูปแบบโพรซีเดอร์ด้วย date_create และ date_timezone_set:

<?php
$dt = date_create('now', timezone_open('UTC'));
$tz = timezone_open('Europe/Istanbul');

date_timezone_set($dt, $tz);
echo date_format($dt, 'Y-m-d H:i:s T');

// Check transition info
$info = timezone_transitions_get($tz);
echo 'Current offset: ' . ($info[0]['offset'] / 3600) . 'h';

ตรวจสอบความเข้าใจ

สำหรับแอปพลิเคชันที่มีผู้ใช้อยู่ทั่วโลก ควรจัดเก็บวันที่และเวลาไว้ที่ใดในฐานข้อมูล

ทบทวน: เขตเวลาของ PHP

สาระสำคัญเกี่ยวกับเขตเวลา:

  • กำหนดเขตเวลาเริ่มต้นด้วย date_default_timezone_set()
  • ใช้ออบเจ็กต์ DateTimeZone ร่วมกับ DateTime
  • ใช้ setTimezone() เพื่อแปลงระหว่างเขตเวลา
  • จัดเก็บ UTC ในฐานข้อมูลเสมอ
  • ตรวจสอบเขตเวลาของผู้ใช้ด้วย DateTimeZone::listIdentifiers()
  • การประทับเวลาแบบยูนิกซ์คือช่วงเวลาที่ไม่ขึ้นกับเขตเวลา

คำถามที่พบบ่อย

บทเรียน “เขตเวลาใน PHP” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เขตเวลาใน PHP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เขตเวลาใน PHP”

จัดการหลายเขตเวลาด้วย DateTimeZone และ date_default_timezone_set คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เขตเวลาใน PHP” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Unix Timestamps และ date()
  2. คลาส DateTime
  3. การคำนวณวันที่ด้วย DateInterval
  4. เขตเวลาใน PHP
← กลับไปที่ PHP Academy