การทำงานกับ Date และ Time: DateTime Object
ในบทเรียนที่แล้ว เราได้เรียนรู้เกี่ยวกับการจัดการวันที่และเวลาด้วยฟังก์ชันพื้นฐานของ PHP เช่น date(), time(), และ strtotime() ในบทนี้ เราจะเจาะลึกลงไปอีกขั้นด้วยการใช้งาน DateTime object ซึ่งเป็นวิธีที่ยืดหยุ่นและมีประสิทธิภาพมากกว่าในการจัดการวันที่และเวลาใน PHP
DateTime Object คืออะไร?
DateTime object เป็น class ใน PHP ที่ช่วยให้เราสามารถจัดการกับวันที่และเวลาได้อย่างง่ายดายและมีประสิทธิภาพ มันมี methods มากมายที่ช่วยให้เราสามารถสร้าง, แก้ไข, format, และเปรียบเทียบวันที่และเวลาได้
การสร้าง DateTime Object
เราสามารถสร้าง DateTime object ได้หลายวิธี วิธีที่ง่ายที่สุดคือการสร้างโดยไม่ระบุ parameter ใดๆ ซึ่งจะสร้าง object ที่แสดงถึงวันที่และเวลาปัจจุบัน:
<?php
$date = new DateTime();
print_r($date);
?>
ผลลัพธ์ที่ได้ (ขึ้นอยู่กับเวลาปัจจุบัน) จะคล้ายกับ:
DateTime Object
(
[date] => 2024-01-26 10:30:00.000000
[timezone_type] => 3
[timezone] => Asia/Bangkok
)
นอกจากนี้ เรายังสามารถระบุวันที่และเวลาที่ต้องการได้โดยการส่ง string เข้าไปใน constructor:
<?php
$date = new DateTime('2024-03-15');
print_r($date);
$dateTime = new DateTime('2024-03-15 14:30:00');
print_r($dateTime);
?>
เรายังสามารถระบุ timezone ได้ด้วย:
<?php
$date = new DateTime('now', new DateTimeZone('America/Los_Angeles'));
print_r($date);
?>
ข้อผิดพลาดที่พบบ่อย: หาก string ที่ส่งเข้าไปใน constructor ไม่ถูกต้อง PHP อาจจะ throw exception หรือสร้าง object ที่มีค่าผิดพลาด ดังนั้นควรตรวจสอบ format ของ string ให้ถูกต้องก่อนเสมอ
การ Format วันที่และเวลาด้วย DateTime Object
DateTime object มี method ชื่อ format() ที่ใช้สำหรับ format วันที่และเวลาให้อยู่ในรูปแบบที่เราต้องการ รูปแบบที่ใช้ใน format() จะเหมือนกับรูปแบบที่ใช้ในฟังก์ชัน date() ที่เราได้เรียนรู้ไปแล้ว
<?php
$date = new DateTime();
echo $date->format('Y-m-d H:i:s'); // รูปแบบ ISO 8601
echo "<br>";
echo $date->format('d/m/Y'); // รูปแบบที่นิยมในยุโรป
echo "<br>";
echo $date->format('F j, Y, g:i a'); // รูปแบบที่อ่านง่าย
?>
ตัวอย่างเพิ่มเติม:
Y: ปี (4 หลัก) เช่น 2024y: ปี (2 หลัก) เช่น 24m: เดือน (ตัวเลข 2 หลัก) เช่น 01, 12n: เดือน (ตัวเลข ไม่นำหน้าด้วย 0) เช่น 1, 12d: วัน (ตัวเลข 2 หลัก) เช่น 01, 31j: วัน (ตัวเลข ไม่นำหน้าด้วย 0) เช่น 1, 31H: ชั่วโมง (24 ชั่วโมง) เช่น 00, 23h: ชั่วโมง (12 ชั่วโมง) เช่น 01, 12i: นาที เช่น 00, 59s: วินาที เช่น 00, 59a: am หรือ pmA: AM หรือ PM
การคำนวณวันที่และเวลาด้วย DateTime Object
DateTime object มี methods ที่ช่วยให้เราสามารถเพิ่มหรือลดวันที่และเวลาได้อย่างง่ายดาย โดยใช้ method add() และ sub() ร่วมกับ DateInterval object
DateInterval object ใช้สำหรับกำหนดช่วงเวลาที่เราต้องการเพิ่มหรือลด
<?php
$date = new DateTime();
echo "วันที่ปัจจุบัน: " . $date->format('Y-m-d H:i:s') . "<br>";
// เพิ่ม 1 วัน
$date->add(new DateInterval('P1D'));
echo "เพิ่ม 1 วัน: " . $date->format('Y-m-d H:i:s') . "<br>";
// ลด 1 เดือน
$date->sub(new DateInterval('P1M'));
echo "ลด 1 เดือน: " . $date->format('Y-m-d H:i:s') . "<br>";
// เพิ่ม 2 ชั่วโมง 30 นาที
$date->add(new DateInterval('PT2H30M'));
echo "เพิ่ม 2 ชั่วโมง 30 นาที: " . $date->format('Y-m-d H:i:s') . "<br>";
?>
คำอธิบาย DateInterval format:
P: Period (ระยะเวลา)Y: Year (ปี)M: Month (เดือน)D: Day (วัน)T: Time (เวลา - ต้องมี H, M, หรือ S)H: Hour (ชั่วโมง)M: Minute (นาที)S: Second (วินาที)
ตัวอย่าง DateInterval:
P1D: 1 วันP1M: 1 เดือนP1Y: 1 ปีP1DT2H: 1 วัน 2 ชั่วโมงPT30M: 30 นาที
การเปรียบเทียบวันที่และเวลา
เราสามารถเปรียบเทียบ DateTime objects ได้โดยตรงโดยใช้ operators เช่น <, >, ==, !=, <=, และ >=
<?php
$date1 = new DateTime('2024-01-26');
$date2 = new DateTime('2024-02-15');
if ($date1 < $date2) {
echo "วันที่ 1 น้อยกว่าวันที่ 2";
} elseif ($date1 > $date2) {
echo "วันที่ 1 มากกว่าวันที่ 2";
} else {
echo "วันที่ 1 เท่ากับวันที่ 2";
}
?>
การหาช่วงห่างระหว่างวันที่สองวัน
เราสามารถใช้ method diff() เพื่อหาช่วงห่างระหว่าง DateTime objects สองตัวได้ ผลลัพธ์ที่ได้จะเป็น DateInterval object
<?php
$date1 = new DateTime('2024-01-26');
$date2 = new DateTime('2024-02-15');
$interval = $date1->diff($date2);
echo $interval->format('%R%a days'); // แสดงจำนวนวัน
?>
%R คือ sign (+ สำหรับ positive, - สำหรับ negative) และ %a คือจำนวนวันทั้งหมด
การเปลี่ยน Timezone
เราสามารถเปลี่ยน timezone ของ DateTime object ได้โดยใช้ method setTimezone()
<?php
$date = new DateTime('now', new DateTimeZone('America/Los_Angeles'));
echo "Timezone เดิม: " . $date->getTimezone()->getName() . "<br>";
echo "เวลาเดิม: " . $date->format('Y-m-d H:i:s') . "<br>";
$date->setTimezone(new DateTimeZone('Asia/Bangkok'));
echo "Timezone ใหม่: " . $date->getTimezone()->getName() . "<br>";
echo "เวลาใหม่: " . $date->format('Y-m-d H:i:s') . "<br>";
?>
ข้อควรระวัง: การเปลี่ยน timezone จะเปลี่ยนเวลาของ object ดังนั้นควรระวังเมื่อทำการคำนวณวันที่และเวลาหลังจากเปลี่ยน timezone แล้ว
กรณีใช้งานจริง
- การแสดงวันที่และเวลาในรูปแบบที่แตกต่างกัน: ใช้
format()method เพื่อแสดงวันที่และเวลาในรูปแบบที่เหมาะสมกับ locale ของผู้ใช้ - การคำนวณอายุ: ใช้
diff()method เพื่อคำนวณอายุของผู้ใช้จากวันเกิด - การนับถอยหลังสู่วันสำคัญ: ใช้
diff()method เพื่อคำนวณจำนวนวันที่เหลือจนถึงวันสำคัญ - การจัดการ events ที่มี timezone ที่แตกต่างกัน: ใช้
setTimezone()method เพื่อแปลงเวลาของ event ให้เป็น timezone ของผู้ใช้
สรุป
DateTime object เป็นเครื่องมือที่มีประสิทธิภาพในการจัดการวันที่และเวลาใน PHP มันมีความยืดหยุ่นและมี methods มากมายที่ช่วยให้เราสามารถทำงานกับวันที่และเวลาได้อย่างง่ายดาย ในบทเรียนถัดไป เราจะเรียนรู้เกี่ยวกับการจัดการ error ใน PHP โดยใช้ try, catch, และ finally