Codding Gun

ทำงานกับวันที่และเวลาใน PHP

การทำงานกับวันที่เป็นโจทย์ที่เราต้องเจออยุ่ตลอดเวลา ซึ่งใน PHP นั้นมีทั้ง date() และ DateTime มาให้ใช้ ในบทความนี้จะพาคุณไปดูความแตกต่างระหว่าง 2 ตัวนี้

  1. การใช้งาน date()
  2. การใช้งาน DateTime

date() Function

รูปแบบของการใช้งานฟังก์ชั่น date จะเป็นการเรียก function แบบง่ายๆ จะใช้งานได้ง่ายกว่า แต่ถ้า code เริ่มมีความซับซ้อนมากๆ จะแก้ไขและนำไป re-use ได้ยากกว่า DateTime ซึ่งวิธีการใช้งานจะเป็น ดังนี้

date(format, timestamp)

โดยที่เราต้องระบุ parameters เข้าไป 2 ตัวคือ

  1. Date format คือรูปแบบของวันที่ (ต้องใส่ ไม่ใส่ไม่ได้)
  2. Timestamp คือระยะห่างระหว่างวันที่ปัจจุบันกับ base date(ไม่ต้องใส่ก็ได้ ถ้าไม่ใส่จะใช้วันที่และเวลาปัจจุบัน)

ใน Web Page ทุกๆหน้าเราต้องระบุ Copyright ซึ่งต้องมีปีในการกำกับถ้าเราต้องการให้ Copyright ของเราเปลี่ยนเป็นปีปัจจุบันตลอดเวลาให้เขียนแบบนี้

&copy; 2010-<?php echo date("Y");?>

การใช้ strtotime() Function

strtotime() เป็นฟังก์ชั่นที่แปลงจาก string ไปเป็นวันที่ ซึ่งจะตรงข้ามกับ date() ที่เปลงจากวันที่เป็น string ดังนั้นถ้าเราต้องการนำข้อความที่ได้มาไปแปลงเป็นวันที่ให้เขียนแบบนี้

1
2
3
4
<?php
    $date=strtotime("December 15 2023 10:30pm ");
    echo "ข้อความนี้สร้างขึ้นเมื่อวันที่ " . date("Y-m-d เวลา H:i:s", $date);
?>

ผลลัพธ์จะออกมาเป็น

ข้อความนี้สร้างขึ้นเมื่อวันที่ 2023-12-15 เวลา 22:30:00

นอกจากนี้เรายังสามารถใช้คำทั่วไปแทนการใส่วันที่เข้าไป

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
    $tomorrow=strtotime("tomorrow");
    echo date("Y-m-d h:i:sa", $d) . "<br>";

    $nextSaturday=strtotime("next Saturday");
    echo date("Y-m-d h:i:sa", $d) . "<br>";

    $next3Month=strtotime("+3 Months");
    echo date("Y-m-d h:i:sa", $d) . "<br>";
?>

ผลลัพธ์จะออกมาเป็น

2023-12-14 12:00:00am
2023-12-16 12:00:00am
2024-03-13 10:07:54am

การใช้งาน date_create()

เราสามารถใช้ date_create() ในการสร้าง DateTime Object ขึ้นมาได้แบบนี้

$now = date_create();

ซึ่งความแตกต่างของ date() กับ date_create() คือ date() จะ return เป็น string ดังนั้นถ้าเราอยากได้่ผลลัพธ์ของข้อความหน้าตาแบบไหน เราต้องใส่ parameter เข้าไปเลยเหมือนกับในตัวอย่างก่อนหน้า(format เป็น parameter ที่ต้องใส่)

แต่ date_create() จะ return ผลลัพธ์เป็น DateTime Object ดังนั้นเราสามารถสร้าง object ขึ้นมาได้เลยโดยที่ไม่ต้อใส่ format เข้าไปเพราะเราสามารถกำหนด format ภายหลังได้

1
2
3
4
<?php
    $date=date_create();
    echo $date->format('d/m/Y');
?>

ผลลัพธ์จะออกมาเป็น

13/12/2023

แนะนำให้ใช้ date_create() แทนการใช้งาน date()

DateTime Object

การใช้งาน DateTime Object จะเป็นการเขียนแบบ Object Oriented Programming(OOP) ซึ่งถ้าเคยเขียน OOP มาแล้วจะรู้สึกว่า DateTime นั้นอ่านและแก้ไขได้ง่ายกว่า date() หรือ date_create()

สร้าง DateTime Object

เราจะเริ่มต้นใช้งาน DateTime Object จากการสร้าง DateTime Object ขึ้นมาด้วยวิธีต่างๆ ดังนี้

  1. new DateTime ขึ้นมาใหม่

    $currentDate = new DateTime();
    
  2. สร้าง DateTime ขึ้นมาจากข้อความ

    $currentDate = DateTime::createFromFormat('d-m-Y', '1-3-2016');
    

    เราต้องระบุ format ของวันที่ให้ตรงกับข้อความที่เราได้ใส่เข้าไปเป็น parameter ตัวที่ 2 ถ้าไม่ตรงกัน DateTime ที่เราได้จะไม่ถูกต้อง

  3. ใช้ date_create()

    $currentDate = date_create('2023-12-15');
    

จัดการเพิ่มหรือลบวันที่

เราสามารถขยับวันที่ของเราไปมาได้ด้วยคำสั่ง sub(กลับไปในอดีต) และ add(ไปในอนาคต) โดยที่กำหนดช่วงเวลาที่จะไปข้างหน้าและย้อนหลังด้วย DateInterval

ตัวอย่าง การหาว่าถอยหลังจากวันที่ 12 ธันวาคม 2566 ย้อนกลับไป 3 เดือนจะเป็นวันที่เท่าไหร่

1
2
3
4
5
<?php
    $date = new DateTime('2023-12-15');
    $date->sub(new DateInterval('P3M'));
    echo $date->format('d/m/Y');
?>

ผลลัพธ์จะออกมาเป็น เดือน 9 ซึ่งย้อนกลับไป 3 เดือน

15/09/2023

ตัวอย่าง การหาว่าหลังจากผ่านจากวันที่ 12 ธันวาคม 2566 ไปข้างหน้า 3 เดือนจะเป็นวันที่เท่าไหร่

1
2
3
4
5
<?php
    $date = new DateTime('2023-12-15');
    $date->add(new DateInterval('P3M'));
    echo $date->format('d/m/Y');
?>

ผลลัพธ์จะออกมาเป็น วันที่ 15 มีนาคม ปี 2567

15/03/2024

DateInterval

ใน PHP เราจะกำหนดช่วงของวันเละเวลาด้วย DateInternal object โดยที่เราสามารถกำหนดช่วงของเวลาได้ด้วยรูปแบบ ดังนี้

  1. นำหน้าด้วย P
  2. ตามด้วยจำนวนที่ต้องการ
  3. ใส่หน่วยเข้่าไป โดยที่หน่วยของวันแลัเวลาจะใช้ตัวอักษรต่างๆ ดังนี้
    ตัวอักษร ความหมาย
    Y จำนวนปี
    M จำนวนเดือน
    W จำนวนสัปดาห์
    D จำนวนวัน
    H จำนวนชั่วโมง
    I จำนวนนาที
    s จำนวนวินาที

ตัวอย่าง การนิยามช่วงเวลา

$oneMonth = new DateInterval('P1M');
$threeWeeks = new DateInterval('P3W');
$threeWeeks2Days = new DateInterval('P3W2D')
// เวลาต้องคั่นด้วย T
$oneDay12Hours = new DateInterval('P1DT12H');

จัดการกับ Format ของ DateTime

เราวสามารถระบุ format ของวันที่และเวลาที่ต้องการแสดงผลด้วย method format

echo $currentDate->format('d F Y');

ดูรายละเอียดเรื่องการจัด format ของวันที่

Phanupong Permpimol
Follow me