Định dạng ngày trong PHP là một chuỗi mà các chữ cái đại diện cho từng phần của ngày: date('Y-m-d H:i:s') in ra kiểu như 2026-03-14 09:05:07. Y là năm 4 chữ số, m là tháng, d là ngày, H là giờ (đồng hồ 24 giờ), i là phút và s là giây; ký tự nào không phải chữ định dạng, như -, / hay :, được in ra nguyên vẹn. Cùng các chuỗi định dạng này dùng được cho cả date() lẫn DateTimeImmutable::format().
Sửa $format rồi nhấn Chạy. Ngày được cố định là Thứ Bảy, 14 tháng 3 năm 2026, lúc 09:05:07, nên bạn thấy rõ từng chữ cái làm gì:
Đầu ra:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format) định dạng thời điểm hiện tại, date($format, $timestamp) định dạng một timestamp, còn $date->format($format) định dạng một đối tượng ngày. Mọi thứ khác về ngày tháng, từ strtotime() đến múi giờ, có ở trang PHP date().
Các ký tự định dạng ngày
Mọi ví dụ bên dưới là kết quả cho 2026-03-14 09:05:07.123456 theo giờ UTC.
Ngày
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
d | Ngày trong tháng, 2 chữ số có số 0 ở đầu (01 đến 31) | 14 |
j | Ngày trong tháng, không có số 0 ở đầu (1 đến 31) | 14 |
D | Tên thứ viết tắt, 3 chữ cái | Sat |
l (chữ L thường) | Tên thứ đầy đủ | Saturday |
N | Thứ trong tuần theo ISO, 1 (Thứ Hai) đến 7 (Chủ Nhật) | 6 |
w | Thứ trong tuần, 0 (Chủ Nhật) đến 6 (Thứ Bảy) | 6 |
S | Hậu tố tiếng Anh cho ngày: st, nd, rd hoặc th. Dùng sau j | th |
z | Ngày trong năm, bắt đầu từ 0 | 72 |
Tuần và tháng
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
W | Số tuần theo ISO 8601 (tuần bắt đầu từ Thứ Hai) | 11 |
F | Tên tháng đầy đủ | March |
M | Tên tháng viết tắt, 3 chữ cái | Mar |
m | Số tháng có số 0 ở đầu (01 đến 12) | 03 |
n | Số tháng không có số 0 ở đầu (1 đến 12) | 3 |
t | Số ngày trong tháng | 31 |
Năm
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
Y | Năm đầy đủ, ít nhất 4 chữ số | 2026 |
y | Năm, 2 chữ số | 26 |
L | 1 nếu là năm nhuận, ngược lại 0 | 0 |
o | Năm theo cách đánh số tuần ISO 8601 (dùng cùng W) | 2026 |
X | Năm đầy đủ mở rộng, có dấu (PHP 8.2+) | +2026 |
x | Năm đầy đủ mở rộng, chỉ có dấu khi cần (PHP 8.2+) | 2026 |
Giờ
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
H | Giờ, đồng hồ 24 giờ, có số 0 ở đầu (00 đến 23) | 09 |
G | Giờ, đồng hồ 24 giờ, không có số 0 ở đầu (0 đến 23) | 9 |
h | Giờ, đồng hồ 12 giờ, có số 0 ở đầu (01 đến 12) | 09 |
g | Giờ, đồng hồ 12 giờ, không có số 0 ở đầu (1 đến 12) | 9 |
i | Phút có số 0 ở đầu (00 đến 59) | 05 |
s | Giây có số 0 ở đầu (00 đến 59) | 07 |
a | am hoặc pm | am |
A | AM hoặc PM | AM |
v | Mili giây | 123 |
u | Micro giây (luôn là 000000 trong date(), vốn chỉ nhận giây nguyên) | 123456 |
B | Giờ Internet Swatch (000 đến 999) | 420 |
Múi giờ
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
e | Định danh múi giờ | UTC |
T | Tên viết tắt của múi giờ | UTC |
P | Chênh lệch so với UTC, có dấu hai chấm | +00:00 |
p | Giống P, nhưng là Z với UTC | Z |
O | Chênh lệch so với UTC, không có dấu hai chấm | +0000 |
Z | Chênh lệch tính bằng giây | 0 |
I (chữ i hoa) | 1 khi đang áp dụng giờ mùa hè, ngược lại 0 | 0 |
Ngày giờ đầy đủ
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
c | Ngày giờ theo ISO 8601 | 2026-03-14T09:05:07+00:00 |
r | Ngày theo RFC 2822, dùng trong header email | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Unix timestamp (số giây kể từ 1970-01-01 UTC) | 1773479107 |
Vẫn bảng đó, nhưng chạy trực tiếp: khối này in mọi ký tự cho một ngày bạn chọn. Thử ngày sinh của bạn, một thời điểm buổi chiều, hoặc ngày cuối của một năm nhuận:
In chữ cái và từ ngữ trong chuỗi định dạng
Mọi chữ cái trong chuỗi định dạng đều được hiểu là ký tự định dạng, nên 'Today is l' không in ra "Today is": T, o, d, a, y, i và s đều là ký tự định dạng. Đặt dấu gạch chéo ngược trước mỗi chữ cái bạn muốn in nguyên vẹn. Trong chuỗi dùng nháy kép, \t vốn đã là ký tự tab, nên hãy dùng nháy đơn cho các định dạng có dấu gạch chéo ngược:
Đầu ra:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
Các định dạng ngày thường dùng
Phần lớn code chỉ cần vài định dạng. Khối này in chúng thành một bảng HTML, nên kết quả hiện ở tab Trang:
Hãy lưu và so sánh ngày theo dạng Y-m-d hoặc Y-m-d H:i:s: chuỗi theo thứ tự đó sắp xếp đúng như thứ tự của ngày, điều mà chuỗi d/m/Y không làm được.
ISO 8601, DATE_ATOM và các định dạng chuẩn khác
PHP có sẵn hằng số cho các định dạng mà API, feed và cookie cần. DATE_ATOM (cũng là DateTimeInterface::ATOM) là ISO 8601 và RFC 3339, định dạng mà các API JSON dùng:
Đầu ra:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
Cũng có hằng số DATE_ISO8601, nhưng phần chênh lệch múi giờ của nó không có dấu hai chấm (+0000), điều mà ISO 8601 không cho phép ở dạng này; hãy dùng DATE_ATOM.
Định dạng ngày kiểu Nhật (Y年m月d日)
Các ký tự không phải chữ định dạng được in nguyên vẹn, kể cả chữ kanji, nên 'Y年n月j日' chạy đúng như bạn viết. n và j bỏ số 0 ở đầu (3月14日), còn m và d giữ lại (03月14日). Tên thứ là phần duy nhất mà date() không dịch được, vì nó chỉ biết tên tiếng Anh; thay vào đó, hãy ánh xạ số w sang danh sách của riêng bạn:
Đầu ra:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
Để bản địa hóa đầy đủ, gồm cả tên tháng bằng ngôn ngữ khác và niên hiệu Nhật Bản (令和), IntlDateFormatter của extension intl định dạng theo mẫu của từng locale. Nó dùng ký tự mẫu của ICU (yyyy, MM, EEEE), không phải các ký tự PHP trên trang này:
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
Chuyển ngày từ định dạng này sang định dạng khác
Để biến 14/03/2026 thành 2026-03-14, hãy phân tích chuỗi theo định dạng nó đang được viết bằng DateTimeImmutable::createFromFormat(), rồi định dạng lại. Hàm này dùng cùng các ký tự như trong bảng. Bắt đầu định dạng bằng !, nếu không các trường bạn không cung cấp (ở đây là giờ) sẽ được lấy từ thời điểm hiện tại:
Đầu ra:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
Với ngày do người dùng nhập, hãy coi mọi cảnh báo từ getLastErrors() là ngày không hợp lệ, giống như khi nhận được false.
Lỗi thường gặp với định dạng ngày
Có ba bug lặp đi lặp lại: dùng m khi ý là i, nhầm Y với y, và để strtotime() tự đoán thứ tự ngày và tháng. strtotime() hiểu dấu gạch chéo theo thứ tự tháng/ngày kiểu Mỹ, còn dấu gạch nối hoặc dấu chấm theo thứ tự ngày-tháng, nên cùng các chữ số lại cho ra hai ngày khác nhau:
Đầu ra:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
Khi đã biết định dạng của dữ liệu đầu vào, hãy nói rõ bằng createFromFormat() thay vì để strtotime() đoán.
Câu hỏi thường gặp
date('Y-m-d') trong PHP có nghĩa là gì?
Mỗi chữ cái được thay bằng một phần của ngày: Y là năm 4 chữ số, m là tháng có số 0 ở đầu và d là ngày có số 0 ở đầu, còn dấu gạch nối được in ra nguyên vẹn. Vào ngày 14 tháng 3 năm 2026, kết quả là 2026-03-14.
Làm sao chuyển một ngày từ định dạng này sang định dạng khác trong PHP?
Phân tích chuỗi theo định dạng hiện có của nó, rồi định dạng lại theo định dạng bạn muốn: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') trả về 2026-03-14. createFromFormat() trả về false khi chuỗi không khớp, nên hãy kiểm tra điều đó trước.
m và i trong định dạng ngày PHP khác nhau thế nào?
m là tháng (01 đến 12) còn i là phút (00 đến 59). Viết 'H:m' thay vì 'H:i' là một bug hay gặp: chỗ lẽ ra là phút lại hiện số tháng.
Làm sao định dạng ngày theo ISO 8601 trong PHP?
Dùng ký tự c hoặc hằng số DATE_ATOM: $date->format(DATE_ATOM) trả về 2026-03-14T09:05:07+00:00. Tránh DATE_ISO8601: phần chênh lệch múi giờ của nó không có dấu hai chấm (+0000), nên không phải ISO 8601 hợp lệ.
Làm sao hiện thứ trong tuần bằng tiếng Nhật với date() của PHP?
date() chỉ in tên tiếng Anh, nên hãy ánh xạ số w (0 là Chủ Nhật đến 6 là Thứ Bảy) sang danh sách của riêng bạn: ['日','月','火','水','木','金','土'][$date->format('w')]. Với extension intl, IntlDateFormatter định dạng được cả ngày theo bất kỳ ngôn ngữ nào.