+1

PHP và MySQL Bài 11: Xử lý thời gian và ngày tháng - Cốt lõi của hệ thống giao dịch

Trong mọi hệ thống quản lý, từ việc ghi lại thời điểm một hành khách quét thẻ qua cổng kiểm soát, tính toán thời gian hết hạn của vé, cho đến việc chạy các tiến trình chốt ca (batch processing) vào ban đêm, tất cả đều đòi hỏi sự chính xác tuyệt đối về mặt thời gian.

PHP cung cấp một bộ công cụ mạnh mẽ để giải quyết bài toán này.

1. Thiết lập Múi giờ (Timezone) - Bước bắt buộc đầu tiên

Theo mặc định, máy chủ PHP thường sử dụng múi giờ chuẩn quốc tế UTC (Coordinated Universal Time). Nếu bạn gọi hàm lấy giờ hiện tại mà không cấu hình, thời gian trả về sẽ bị lệch (thường là chậm hơn 7 tiếng so với Việt Nam).

Trước khi làm bất kỳ thao tác nào liên quan đến thời gian, bạn cần thiết lập múi giờ mặc định cho toàn bộ kịch bản bằng hàm date_default_timezone_set().

<?php
    // Thiết lập múi giờ cho hệ thống chạy tại Việt Nam
    date_default_timezone_set('Asia/Ho_Chi_Minh');
    
    echo "Múi giờ hiện tại: " . date_default_timezone_get();
?>

2. Unix Timestamp - Ngôn ngữ thời gian của máy tính

Con người hiểu thời gian theo định dạng ngày/tháng/năm. Nhưng máy tính thì không. Máy tính sử dụng khái niệm Unix Timestamp (Dấu thời gian).

Đó là một con số nguyên khổng lồ, đại diện cho tổng số giây đã trôi qua kể từ thời điểm mốc 00:00:00 ngày 01/01/1970 (được gọi là Unix Epoch).

  • time(): Trả về Timestamp của thời điểm hiện tại.
<?php
    $thoiDiemHienTai = time();
    echo "Timestamp hiện tại là: " . $thoiDiemHienTai . "\n";
    // Kết quả sẽ là một dãy số như: 1722824498
?>

Mẹo thiết kế hệ thống: Trong các hệ thống CSDL có lưu lượng đọc/ghi cao, người ta thường lưu trữ thời gian dưới dạng con số Timestamp này thay vì chuỗi văn bản, giúp tối ưu hóa không gian lưu trữ và tăng tốc độ truy vấn.


3. Hàm date() - Trình bày thời gian cho con người

Để chuyển đổi con số Timestamp khô khan thành định dạng mà người dùng đọc được, chúng ta sử dụng hàm date($format, $timestamp).

Nếu bạn không truyền tham số $timestamp, hàm date() sẽ tự động lấy thời gian hiện tại.

Các định dạng thông dụng nhất:

  • Y: Năm (4 chữ số - VD: 2026)
  • m: Tháng (2 chữ số - có số 0 ở đầu)
  • d: Ngày (2 chữ số)
  • H: Giờ (Định dạng 24h)
  • i: Phút
  • s: Giây

Ví dụ: Tạo mã biên lai và ghi log thời gian khi hành khách mua vé tại máy tự động (Ticket Vending Machine).

<?php
    date_default_timezone_set('Asia/Ho_Chi_Minh');

    // Chuẩn định dạng lưu Database (DATETIME)
    $thoiGianGiaoDich = date('Y-m-d H:i:s');
    
    // Chuẩn định dạng in lên vé giấy cho khách hàng
    $thoiGianInVe = date('d/m/Y H:i');

    echo "Lưu hệ thống: Giao dịch phát sinh lúc " . $thoiGianGiaoDich . "\n";
    echo "In ra vé: " . $thoiGianInVe;
?>

4. Hàm strtotime() - Cỗ máy thời gian (Time Travel)

Đây là hàm thao tác thời gian quyền lực nhất trong bộ thư viện cơ sở của PHP. Nó có khả năng "dịch" các chuỗi văn bản tiếng Anh mô tả thời gian thành con số Timestamp để bạn dễ dàng cộng trừ nhân chia.

  • strtotime("now"): Hiện tại
  • strtotime("+1 day"): Ngày mai
  • strtotime("+2 hours"): 2 tiếng sau
  • strtotime("-1 week"): 1 tuần trước
  • strtotime("next Monday"): Thứ hai tuần tới

Ví dụ: Tính toán thời gian hết hạn của một vé lượt. Giả sử chính sách quy định: Vé được phát hành chỉ có hiệu lực mở cổng trong vòng 120 phút kể từ lúc in.

<?php
    date_default_timezone_set('Asia/Ho_Chi_Minh');

    $thoiGianMuaVe = time(); // Thời điểm hiện tại
    
    // Cộng thêm 120 phút (2 tiếng)
    $thoiGianHetHan = strtotime("+120 minutes", $thoiGianMuaVe);

    echo "Giờ xuất vé: " . date('H:i:s d/m/Y', $thoiGianMuaVe) . "\n";
    echo "Giờ vé vô hiệu hóa: " . date('H:i:s d/m/Y', $thoiGianHetHan);
?>

5. Tiêu chuẩn hiện đại: Lớp đối tượng DateTime

Dù các hàm date()strtotime() rất tiện dụng, nhưng trong các framework hiện đại và các dự án đòi hỏi xử lý múi giờ phức tạp (đa quốc gia), lập trình viên Backend sẽ chuyển sang sử dụng lớp đối tượng (Class) DateTime.

Nó an toàn hơn, tránh được các lỗi liên quan đến giới hạn bộ nhớ của Unix Timestamp (lỗi năm 2038).

<?php
    // Khởi tạo một đối tượng thời gian hiện tại theo múi giờ VN
    $thoiGian = new DateTime('now', new DateTimeZone('Asia/Ho_Chi_Minh'));
    
    // Thay đổi thời gian (Cộng thêm 1 ngày)
    $thoiGian->modify('+1 day');
    
    // In ra màn hình
    echo "Thời gian sau khi xử lý: " . $thoiGian->format('Y-m-d H:i:s');
?>

Tổng kết & Khép lại Phần 2

Thời gian không bao giờ chờ đợi ai, và dữ liệu thời gian trong máy chủ cũng vậy. Thành thạo việc chuyển đổi qua lại giữa định dạng lưu trữ (Timestamp) và định dạng hiển thị (Y-m-d H:i:s) sẽ giúp bạn tránh được vô số những lỗi tiềm ẩn trong quản trị hệ thống.

Đến đây, chúng ta đã chính thức hoàn thành Phần 2: Nền Tảng Lập Trình PHP. Bạn đã trang bị đầy đủ bộ kỹ năng cốt lõi: xử lý biến, toán tử, rẽ nhánh, vòng lặp, mảng, hàm và chuỗi.

Ở bài tiếp theo, chúng ta sẽ bước sang một giai đoạn hoàn toàn mới: Phần 3 - Xử Lý Biểu Mẫu (Forms) & Giao Tiếp Client-Server. Bài 12 sẽ mở màn bằng việc trả lời câu hỏi: Làm thế nào để Server PHP nhận được dữ liệu do người dùng gõ vào từ trình duyệt?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí