Gỡ rối khi dùng hàm date() trong PHP

Mình thấy các bạn thường copy hàm date() để dùng nhưng có thể là chưa hiểu rõ về hàm này. Do đó, dẫn đến việc cứ copy rồi thử nhiều đối số với hàm date() cho đến khi bạn được kết quả mong muốn.

Nhưng như thế thì mắc công quá. Sao chúng ta không cùng nhau hiểu rõ về hàm date() để sau này dùng một phát là chính xác luôn, không cần “mò mò thử thử” cho phí sức và tốn thời gian nữa. Let’s go!

Hàm date() trong PHP có chức năng trả về thời gian hiện tại dưới dạng chuỗi ký tự theo định dạng (format) thiết lập trước. Nếu bạn có một dấu thời gian (timestamp) và muốn định dạng nó theo một định dạng ngày giờ nào đó, hàm date() cũng sẽ thực hiện giúp bạn.

Lưu ý: Dấu thời gian (timestamp) là một cách biểu diễn thời gian. Nó thường là một số nguyên được mã hóa từ một thời gian nào đó. Ví dụ, ta có thời gian: 19-10-2021 05:30:59 có thể được mã hóa thành timestamp 1634614259.

Trong PHP, có thể dùng lớp DateTime để mã hóa thời gian thành timestamp như sau:

$date = new DateTime("19-10-2021 05:30:59");
echo $date->getTimestamp();//1634614259
date(string $format, int $timestamp = null): string

Trong đó:

  • $format là chuỗi định dạng theo quy ước của lớp DateTimeInterface::format() trong PHP. Nếu sai định dạng có thể gây ra lỗi.
  • $timestamp là tham số tùy chọn, có thể có hoặc không. Nếu không có thì hàm date() sẽ trả về thời gian hiện tại theo $format. Nếu có timestamp thì hàm date() sẽ trả về thời gian được biểu diễn của timestamp theo $format.
  • Kiểu trả về là chuỗi ký tự (string) của thời gian theo định dạng thiết lập trước.

Lưu ý: Nếu $format không đúng định dạng theo quy định hoặc $timestamp không phải kiểu số nguyên thì sẽ gây ra lỗi.

Các định dạng trong hàm date() được quy ước sẵn theo format() của lớp DateTimeInterface::format(). Bên dưới là một số quy ước thường dùng:Ký tự formatMô tảGiá trị trả vềNgày (day)dNgày của tháng, có 2 ký số (có thể bắt đầu với 0)01, 02 đến 09 đến 31DCó 3 ký tự viết tắt đại diện cho thứ trong tuầnMon, Tue đến SunjNgày của tháng, không bắt đầu với 01, 2 đến 9 đến 31lTên đầy đủ của thứ trong tuầnMonday, Tuesday đến SundayNLà số đại diện cho ngày trong tuần theo tiêu chuẩn ISO-86011 (thứ hai) đến 7 (chủ nhật)SCó 2 ký tự thể hiện thứ tự của ngày trong thángst, nd, rd hoặc th. Thường dùng với ký tự format j, ví dụ 5thWLà số đại diện cho ngày trong tuần0 (chủ nhật) đến 6 (thứ bảy)zNgày trong năm, bắt đầu từ 00 đến 365Tuần (week)WSố tuần trong năm theo tiêu chuẩn ISO-8601Ví dụ: 42 (tuần thứ 42 trong năm)Tháng (month)FTên đầy đủ của thángJanuary đến DecembermLà số đại diện cho tháng (có thể bắt đầu với 0)01 đến 12M3 ký tự viết tắt đại điện cho thángJan, Feb đến DecnLà số đại diện cho tháng, không bắt đầu với 01 đến 12tSố ngày tối đa có thể có trong một tháng28, 29, 30, 31Năm (year)LCho biết có phải là năm nhuận hay khôngTrả về 1 nếu năm nhuận, 0 nếu năm không nhuậnYCó 4 ký tự đại diện cho một nămVí dụ, 1999 hoặc 2003yCó 2 ký tự đại diện cho một nămVí dụ, 99 hoặc 03Giờ (time)aViết thường giờ am hoặc pmam hoặc pmAViết hoa giờ AM hoặc PMAM hoặc PMgĐịnh dạng giờ 12 tiếng và không bắt đầu với 01, 2 đến 12GĐịnh dạng giờ 24 tiếng và không bắt đầu với 00, 1, 2 đến 23hĐịnh dạng giờ 12 tiếng và bắt đầu với 001, 02 đến 12HĐịnh dạng giờ 24 tiếng và bắt đầu với 000, 01, 02 đến 23iĐịnh dạng phút bắt đầu với 000, 01 đến 59sĐịnh dạng giây bắt đầu với 000, 01 đến 59uLà microseconds. Hàm date() sẽ luôn ra 000000 vì không hỗ trợ microseconds. Lớp Datetime thì hỗ trợ microseconds.Ví dụ: 654321vLà milliseconds. Tương tự như u với date() và DatetimeVí dụ: 654TimezoneeThể hiện múi giờ (timezone)Ví dụ: UTC, GMT, Atlantic/AzoresOChênh lệch múi giờ với giờ GMT (+0) (không có : ở giữa giờ và phút)Ví dụ: +0200PChênh lệch múi giờ với giờ GMT (+0) (có : ở giữa giờ và phút)Ví dụ: +02:00TViết tắt múi giờ (nếu biết). Còn không thì lấy chênh lệch với giờ GMT (+0)Ví dụ: EST, MDT hoặc +05Full date/timecĐịnh dạng thời gian theo tiêu chuẩn ISO 8601Ví dụ: 2004-02-12T15:19:21+00:00rĐịnh dạng thời gian theo tiêu chuẩn RFC 2822Ví dụ: Thu, 21 Dec 2000 16:01:07 +0200

$today1 = date("F j, Y, g:i a");//October 5, 2021, 6:29 am
$today2 = date("m.d.y");//10.05.21
$today3 = date("j, n, Y");//5, 10, 2021
$today4 = date("Ymd");//20211005
$today5 = date('h-i-s, j-m-y, it is w Day');//06-29-51, 5-10-21, 2931 2951 2 Tueam21
$today6 = date('\i\t \i\s \t\h\e jS \d\a\y.');//it is the 5th day.
$today7 = date("D M j G:i:s T Y");//Tue Oct 5 6:29:51 CEST 2021
$today8 = date('H:m:s \m \i\s\ \m\o\n\t\h');//06:10:51 m is month
$today9 = date("H:i:s");//06:29:51
$today10 = date("Y-m-d H:i:s");//2021-10-05 06:29:51
//date() có timestamp
$datetime = date('d-m-Y H:i:s', 1634614259);//19-10-2021 05:30:59
$datetime = date('d-m-Y H:i:s');//05-10-2021 06:37:16
//hoặc
date_default_timezone_set('Asia/Ho_Chi_Minh');
$datetime = date('d-m-Y H:i:s');//05-10-2021 11:37:16

Kết quả của hàm date() khi không thiết lặp timezone và khi thiết lặp timezone là khác nhau về giờ. Khi không thiết lặp timezone thì PHP sẽ lấy thời gian theo timezone mặc định được cấu hình trong file php.ini.

3.4. Thay đổi default timezone trong PHP

Nếu sử dụng XAMPP thì vào Config của Apache để cấu hình lại file php.ini.

Cấu hình file php.iniCấu hình file php.ini

Tìm date.timezone và thay đổi timezone theo những timezone được hỗ trợ List of Supported Timezones mà bạn muốn.

Đổi timezone trong file php.iniĐổi timezone trong file php.ini

Qua bài này, hy vọng các bạn sẽ hiểu rõ về date() trong PHP và tránh những bối rối khi sử dụng hàm này.

5/5 – (1 bình chọn)