Bài này gồm hai kỹ năng cần cho mọi dự án: xử lý ngày giờ (date, DateTime, múi giờ Việt Nam, tính khoảng cách) và tách mã thành nhiều tệp bằng include/require để dùng lại header, footer, cấu hình, hàm.
- Định dạng và tính toán ngày giờ với date, strtotime, DateTime
- Đặt múi giờ Asia/Ho_Chi_Minh
- Dùng include, require, require_once đúng chỗ
- Tổ chức dự án với config, functions, header, footer
Khái niệm và lý thuyết
PHP lưu thời gian dạng timestamp (số giây từ 1/1/1970). date() định dạng timestamp thành chuỗi; DateTime là lớp hướng đối tượng mạnh hơn, hỗ trợ cộng trừ, so sánh, múi giờ. Luôn đặt múi giờ ở đầu dự án (hoặc trong php.ini: date.timezone = Asia/Ho_Chi_Minh).
include chèn tệp khác vào vị trí đó; thiếu tệp chỉ cảnh báo. require dừng chương trình nếu thiếu. Hậu tố _once bảo đảm chỉ nạp một lần (tránh khai báo hàm trùng). Quy ước: require_once cho cấu hình và hàm; include cho các mảnh giao diện.
date và strtotime
<?php
date_default_timezone_set("Asia/Ho_Chi_Minh");
echo date("d/m/Y H:i:s"), "<br>"; // 10/11/2026 14:30:05
echo date("l, d F Y"), "<br>"; // Tuesday, 10 November 2026
$thu = ["CN","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"][date("w")];
echo "$thu, ngày ", date("j/n/Y"), "<br>";
echo date("d/m/Y", strtotime("+7 days")), "<br>"; // hạn nộp sau 7 ngày
echo date("d/m/Y", strtotime("2026-12-31")), "<br>";
echo date("d/m/Y", mktime(0, 0, 0, 9, 2, 2026)); // 02/09/2026| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
| d / j | Ngày (2 số / không 0) | 05 / 5 |
| m / n | Tháng | 11 |
| Y / y | Năm 4 số / 2 số | 2026 / 26 |
| H:i:s | Giờ:phút:giây 24h | 14:30:05 |
| D / l | Thứ viết tắt / đầy đủ | Tue / Tuesday |
| N / w | Thứ 1–7 / 0–6 | 2 |
| t | Số ngày của tháng | 30 |
DateTime
<?php
$han = new DateTime("2026-12-31 23:59", new DateTimeZone("Asia/Ho_Chi_Minh"));
$nay = new DateTime();
$con = $nay->diff($han);
echo "Còn {$con->days} ngày ({$con->m} tháng {$con->d} ngày)<br>";
$ns = DateTime::createFromFormat("d/m/Y", "15/08/2006"); // đọc định dạng Việt
echo "Tuổi: ", $ns->diff($nay)->y, "<br>";
$hoc_ky = (clone $nay)->modify("+15 weeks");
echo $hoc_ky->format("d/m/Y"), "<br>";
$sql_date = $ns->format("Y-m-d"); // định dạng MySQLinclude và require
<?php
// config.php
const DB_HOST = "localhost"; const DB_NAME = "qlsv";
date_default_timezone_set("Asia/Ho_Chi_Minh");
// functions.php
function e(string $s): string { return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); }
// header.php
?><!DOCTYPE html><html lang="vi"><head><meta charset="UTF-8">
<title><?= e($tieu_de ?? "Quản lý sinh viên") ?></title>
<link rel="stylesheet" href="/qlsv/css/style.css"></head><body>
<nav><a href="/index.php">Trang chủ</a> | <a href="/sinhvien.php">Sinh viên</a></nav>
<?php
// index.php
require_once __DIR__ . "/config.php";
require_once __DIR__ . "/functions.php";
$tieu_de = "Trang chủ";
include __DIR__ . "/header.php";
?>
<h1>Chào mừng</h1>
<?php include __DIR__ . "/footer.php"; ?>qlsv/
├── config.php # hằng cấu hình, múi giờ
├── functions.php # hàm dùng chung
├── db_connect.php # kết nối CSDL (loạt PHP và MySQL)
├── header.php, footer.php
├── index.php, sinhvien.php, them.php ...
└── css/, js/, uploads/Dùng __DIR__ . "/tep.php" thay vì đường dẫn tương đối để include luôn đúng dù tệp được gọi từ thư mục khác.
Tệp config chứa mật khẩu CSDL phải nằm ngoài thư mục công khai hoặc được chặn truy cập trực tiếp; không commit lên GitHub (dùng .gitignore).
- Hiển thị “Hôm nay là Thứ ..., ngày ... tháng ... năm ...” bằng tiếng Việt.
- Tính số ngày còn lại đến Tết Nguyên đán 2027 (17/02/2027).
- Tách trang bai1.php thành header.php, footer.php, functions.php và dùng lại ở 3 trang.
- Viết hàm dinh_dang_ngay(string $mysql_date): string chuyển 2026-11-10 thành 10/11/2026.
- Đặt múi giờ Asia/Ho_Chi_Minh; date() định dạng, strtotime() tính toán.
- DateTime cho diff, modify, createFromFormat, múi giờ.
- require_once cho config/functions; include cho header/footer.
- Dùng __DIR__ cho đường dẫn include.