Menu

Định dạng ngày PHP: mọi ký tự định dạng của date()

Định dạng ngày trong PHP là một chuỗi gồm các chữ cái như 'Y-m-d H:i:s', trong đó Y là năm 4 chữ số, m là tháng, d là ngày, H là giờ, i là phút và s là giây. Trang này liệt kê mọi ký tự định dạng kèm ví dụ, cùng cách escape, ISO 8601, ngày kiểu Nhật và cách chuyển từ định dạng này sang định dạng khác.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Đị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ĩaVí dụ
dNgày trong tháng, 2 chữ số có số 0 ở đầu (01 đến 31)14
jNgày trong tháng, không có số 0 ở đầu (1 đến 31)14
DTên thứ viết tắt, 3 chữ cáiSat
l (chữ L thường)Tên thứ đầy đủSaturday
NThứ trong tuần theo ISO, 1 (Thứ Hai) đến 7 (Chủ Nhật)6
wThứ trong tuần, 0 (Chủ Nhật) đến 6 (Thứ Bảy)6
SHậu tố tiếng Anh cho ngày: st, nd, rd hoặc th. Dùng sau jth
zNgày trong năm, bắt đầu từ 072

Tuần và tháng

Ký tựÝ nghĩaVí dụ
WSố tuần theo ISO 8601 (tuần bắt đầu từ Thứ Hai)11
FTên tháng đầy đủMarch
MTên tháng viết tắt, 3 chữ cáiMar
mSố tháng có số 0 ở đầu (01 đến 12)03
nSố tháng không có số 0 ở đầu (1 đến 12)3
tSố ngày trong tháng31

Năm

Ký tựÝ nghĩaVí dụ
YNăm đầy đủ, ít nhất 4 chữ số2026
yNăm, 2 chữ số26
L1 nếu là năm nhuận, ngược lại 00
oNăm theo cách đánh số tuần ISO 8601 (dùng cùng W)2026
XNăm đầy đủ mở rộng, có dấu (PHP 8.2+)+2026
xNăm đầy đủ mở rộng, chỉ có dấu khi cần (PHP 8.2+)2026

Giờ

Ký tựÝ nghĩaVí dụ
HGiờ, đồng hồ 24 giờ, có số 0 ở đầu (00 đến 23)09
GGiờ, đồng hồ 24 giờ, không có số 0 ở đầu (0 đến 23)9
hGiờ, đồng hồ 12 giờ, có số 0 ở đầu (01 đến 12)09
gGiờ, đồng hồ 12 giờ, không có số 0 ở đầu (1 đến 12)9
iPhút có số 0 ở đầu (00 đến 59)05
sGiây có số 0 ở đầu (00 đến 59)07
aam hoặc pmam
AAM hoặc PMAM
vMili giây123
uMicro giây (luôn là 000000 trong date(), vốn chỉ nhận giây nguyên)123456
BGiờ Internet Swatch (000 đến 999)420

Múi giờ

Ký tựÝ nghĩaVí dụ
eĐịnh danh múi giờUTC
TTên viết tắt của múi giờUTC
PChênh lệch so với UTC, có dấu hai chấm+00:00
pGiống P, nhưng là Z với UTCZ
OChênh lệch so với UTC, không có dấu hai chấm+0000
ZChênh lệch tính bằng giây0
I (chữ i hoa)1 khi đang áp dụng giờ mùa hè, ngược lại 00

Ngày giờ đầy đủ

Ký tựÝ nghĩaVí dụ
cNgày giờ theo ISO 86012026-03-14T09:05:07+00:00
rNgày theo RFC 2822, dùng trong header emailSat, 14 Mar 2026 09:05:07 +0000
UUnix 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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu