Hàm time / microtime lấy giờ hiện tại trong PHP
Hàm time() trả về thời gian unix timestamp hiện tại của hệ thống, tức là trả về là một số nguyên bằng số giây tính từ thời điểm bắt đầu của kỷ nguyên Unix (lúc 0 giờ, 0 phút, 0 giây ngày 1 tháng 1 năm 1970 - GMT - Lưu ý thời điểm này tính với múi giờ GMT 0, không phải thời gian địa phương)
Từ giời gian Unix Timestamp hiện tại, bạn có thể dùng hàm getdate, date để lấy thông tin ngày - giờ ...
$time = time(); $datetimeinfo = getdate($time); echo 'Thời gian hiện tại (UT):'. $time . '<br>'; echo "<pre>" . print_r($datetimeinfo, true) . "</pre>"; /* In ra: Thời gian hiện tại (UT):1662445670 Array ( [seconds] => 50 [minutes] => 27 [hours] => 6 [mday] => 6 [wday] => 2 [mon] => 9 [year] => 2022 [yday] => 248 [weekday] => Tuesday [month] => September [0] => 1662445670 ) */
Khái niệm về timestamp xem thêm tại: TIMESTAMP.
Hàm microtime tương tự time, nhưng độ chính xác mili giây.
Hàm getdate lấy thông tin ngày tháng
Hàm getdate trả về một mảng chứa các thông tin ngày tháng, với tham số $timestamp là thời gian unix cần chuyển đổi nếu thiếu tham số này hàm getdate lấy timestamp hiện tại của hệ thống. Cú pháp:
getdate([$timestamp]);
Mảng trả về chứa thông tin ngày tháng có các phần tử tương ứng với key của mảng mang ý nghĩa giải thích ở ví dụ sau:
// Hàm getdate thiếu tham số, nó sẽ lấy timestamp hiện tại làm tham số chuyển đổi $today = getdate(); print_r($today); /* Kết quả: Array ( [seconds] => 40 // Giây [minutes] => 58 // Phút [hours] => 21 // Giờ [mday] => 17 // Ngày [wday] => 2 // Ngày tuần (0 = CN, 1 = Thứ 2, 2 = Thứ 3 ...) [mon] => 6 // Tháng [year] => 2003 // Năm [yday] => 167 // Ngày của năm [weekday] => Tuesday // Thứ [month] => June // Tháng [0] => 1055901520 // Timestamp ) */
Hàm date() định dạng ngày giờ từ Unix timestamp trong PHP
Hàm date()
trả về một chuỗi biểu diễn ngày tháng. Chuỗi này chuyển đổi từ thời gian Unix truyền vào.
Cú pháp của hàm như sau:
date($format,$timestamp)
Trong đó:
$timestamp
là thời gian timestamp cần chuyển đổi,
nếu thiếu tham số này hàm date()
lấy thời gian hiện tại của hệ thống để chuyển đổi.
$format
: là chuỗi chứa định dạng, nó xác định chuỗi kết quả trả về sẽ có dữ liệu gì, tham khảo
các ký hiệu sau để viết chuỗi $format:
Ký hiệu | Diễn giả dữ liệu xuất ra | Ví dụ |
---|---|---|
d | Ngày trong tháng (2 số) | 01 đến 31 |
w | Ngày trong tuần (CN = 0) | 0 đến 6 |
D | Tên ngày tuần | Mon đến Sun |
j | Ngày trong tháng (1 số) | 1 đến 31 |
l | Ngày tuần (tên đầy đủ) | Sunday, Saturday |
z | Ngày trong năm (bắt đầu từ 0) | 0 đến 365 |
F | Tên tháng đầy đ | January,December |
m | Tháng (2 số) | 01 đến 12 |
M | Tên ngắn của tháng | Jan, Dec |
n | Tháng (1 số) | 1 đến 12 |
t | Số ngày trong tháng | 28, 31 |
Y | Năm | 1999, 2000 ... |
y | Năm (2 số) | 99, 79 |
a | Thời gian sáng / chiều | am hoặc pm |
A | Thời gian sáng / chiều | AM, PM |
g | Giờ (định dạng theo 12 khoảng) | 1 đến 12 |
G | Giờ (định dạng theo 24) | 0 đến 23 |
h | Giờ (12 khoảng) | 01 đến 12 |
H | Giờ (2 số chia theo 24 khoảng) | 00 đến 23 |
i | Phút | 00 đến 59 |
s | Giây | 00 đến 59 |
Ví dụ:
// Chuỗi này xuất ra các kết quả gồm giờ:phút:giây ngày/tháng/năm: // "12:20:30 20/11/20" $format = "G:i:s d/m/y"; echo date($format, time()); // Out: 6:58:58 06/09/22 // Trong chuỗi định dạng, // để xuất ra ký tự mà đã dùng làm định dạng thì thêm dấu \ echo date('\i\t \i\s \t\h\e jS \d\a\y.'); // it is the 6th day.
Lớp DateTime trong PHP
Lớp DateTime trong PHP chứa thông tin về thời gian (ngày, tháng, giờ ...) và các chức năng liên quan đến tính toán thời gian, chuyển đổi thời gian ...
Để khởi tạo một đối tượng DateTime mới dùng toán tử new:
// Đối tượng DateTime mới với dự liệu thời gian hiện tại, múi giờ hệ thống (Webserver) $datetime = new DateTime(); var_dump($datetime); /* public 'date' => string '2022-09-06 16:20:04.311900' (length=26) public 'timezone_type' => int 3 public 'timezone' => string 'UTC' (length=3) */
Bạn thấy đối tượng có chứa liệu là chuỗi ngày tháng và thông tin timezone. Khởi tạo như trên, dữ liệu là thời gian hiện tại, múi giờ hiện tại của hệ thống. Mặc dù nhịn thấy các thuộc tính date, timezone_type, timezone là public khi dùng var_dump, nhưng bạn không truy cập trực tiếp được, có thể là bug của PHP bug 49382
Ngoài ra một số cách khởi tạo khác bằng cách truyền tham số new DateTime($datetime)
, trong đó là chuỗi có thể là:
'now' |
(hoặc không tham số) - lấy thời gian hiện tại để khởi tạo.
$datetime = new DateTime('now'); |
'@giá-trị-timestamp' |
Truyền vào một chuỗi bắt đầu bằng @ và giá trị timestamp để khởi tạo bằng timestamp
$datetime = new DateTime('@1662445670'); $datetime = new DateTime('@'.time()); |
'chuỗi-ngày-tháng' hoặc dùng hàm createFromFormat
|
Một chuỗi ngày tháng với định dạng phù hợp
$datetime = new DateTime('12/22/2020 10:00 PM'); $datetime = new DateTime('@'.time()); Bạn có thể khởi tạo bằng phương thức DateTime::createFromFormat($format, $s_datetime) với định dạng ngày tháng tùy chọn. $datetime = DateTime::createFromFormat('d/m/y H:i:s', '1/1/20 00:00:00'); |
Đọc dữ liệu từ DateTime
Có các phương thức sau hay dùng để lấy dữ liệu từ DateTime:
getTimestamp()
trả về timestampgetTimezone()
trả về DateTimeZone, thông tin về múi giờformat($format_string)
trả về chuỗi chứa ngày tháng ... theo định dạng viết trong $format_string
$datetime = DateTime::createFromFormat('d/m/y H:i:s', '28/12/21 06:30:59'); echo $datetime->getTimezone()->getName(); // UTC echo $datetime->getTimestamp(); // 1640673059 echo $datetime->format('d/m - h:i'); // 28/12 - 06:30
Thiết lập Timezone (DateTimeZone) và Date, Time, cho DateTime
Đối tượng DateTime có chứa thông tin Timezone (múi giờ) UTC, để thiết lập Timezone trước tiên bạn tạo ra
đối tượng lớp DateTimeZone
với tham số là chuỗi Timezone mà PHP hỗ trợ (danh sách các vùng
tại đây PHP Timezones)
setTimezone
Sau khi có đối tượng DateTimeZone thì thiết lập cho DateTime bằng phương thức setTimezone
$datetime = DateTime::createFromFormat('d/m/y H:i:s', '1/1/20 00:00:00'); $zone_utc = new DateTimeZone('UTC'); $zone_Asia_Ho_Chi_Minh = new DateTimeZone('Asia/Ho_Chi_Minh'); $zone_Asia_Hong_Kong = new DateTimeZone('Asia/Hong_Kong'); $datetime->setTimezone($zone_utc); // In thông tin trong $datetime echo 'Datetime tại gốc UTC 0: ' . $datetime->format('d/m/y H:i:s'), '<br>'; $datetime->setTimezone($zone_Asia_Ho_Chi_Minh); echo 'Datetime tại Việt Nam : ' . $datetime->format('d/m/y H:i:s'), '<br>'; $datetime->setTimezone($zone_Asia_Hong_Kong); echo 'Datetime tại Hồng Kông: ' . $datetime->format('d/m/y H:i:s'), '<br>'; /* Xuất ra Datetime tại gốc UTC 0: 01/01/20 00:00:00 Datetime tại Việt Nam : 01/01/20 07:00:00 Datetime tại Hồng Kông: 01/01/20 08:00:00 */
setDate, setTime
Sau khi khởi tạo DateTime, bạn có thể thay đổi ngày - tháng - nằm bằng hàm setDate, thay đổi giờ-phút-giây với hàm setTime, những hàm này luôn trả về đối tượng $datetime, nên trong code bạn có thể viết một cách liên tục theo chuỗi (fluent interface).
$datetime = DateTime::createFromFormat('d/m/y H:i:s', '1/1/20 00:00:00'); echo $datetime->setTimezone(new DateTimeZone('Asia/Ho_Chi_Minh')) ->setDate(2020, 3, 28) ->setTime(18, 30, 0) ->format(DateTime::RFC822); // DateTime::RFC822 hằng số chuỗi định nghĩa sẵn = 'D, d M y H:i:s O' // Xuất ra: Sat, 28 Mar 20 18:30:00 +0700
So sánh ngày tháng DateTime
Bạn có thể dùng các toán tử so sánh >, <, == , != để so sánh ngày.
$datetime1 = DateTime::createFromFormat('d/m/y H:i:s', '28/12/21 06:30:59'); $datetime2 = DateTime::createFromFormat('d/m/y H:i:s', '28/12/11 06:30:59'); var_dump($datetime1 > $datetime2); // true var_dump($datetime1 == $datetime2); // false var_dump($datetime1 != $datetime2); // true
Tính khoảng thời gian giữa hai DateTime
Sử dụng hàm diff, nó trả về một đói tượng lớp DateInterval, chứa các thuộc tính cho biết khoảng thời gian giữa hai DateTime
$datetime1 = DateTime::createFromFormat('d/m/yy', '28/12/2021'); $datetime2 = DateTime::createFromFormat('d/m/yy', '5/5/2011'); $dateinterval = $datetime2->diff($datetime1); var_dump($dateinterval); echo 'Cách nhau ' . $dateinterval->days . ' ngày'; // Cách nhau 3890 ngày /* object(DateInterval)[502] public 'y' => int 10 // cách nhau số năm + public 'm' => int 7 // số tháng lẻ (không làm tròn về số năm được) public 'd' => int 23 // số ngày lẻ public 'h' => int 0 public 'i' => int 0 public 's' => int 0 public 'f' => float 0 public 'weekday' => int 0 public 'weekday_behavior' => int 0 public 'first_last_day_of' => int 0 public 'invert' => int 0 public 'days' => int 3890 public 'special_type' => int 0 public 'special_amount' => int 0 public 'have_weekday_relative' => int 0 public 'have_special_relative' => int 0*/
Như vậy hai ngày trên cách nhau 3890 ngày, tức cách nhau 10 năm 7 tháng 23 ngày ...
Hãy áp dụng tính xem đến hôm nay bạn đã sinh ra được bao nhiêu ngày?
Thêm hoặc bớt một khoảng thời gian vào DateTime
Bạn cần khởi tạo đối tượng DateInterval, sau đó thêm vào DateTime bằng phương thức add,
hoặc bớt đi bằng phương thức sub.
Khởi tạo DateInterval bằng cú pháp new DateInterval($string_duration)
Chuỗi $string_duration có cú pháp như sau, bắt đầu bằng chữ P, tiếp theo là các khoảng thời gian, mỗi khoảng thời gian bắt đầu bằng một số nguyên theo sau là ký hiệu cho biết loại khoảng thời gian đó (có các ký hiệu Y, M, D, W, H, M, S tương ứng là năm, tháng, ngày, tuần, giờ, phút, giây), ví dụ chuỗi định dạng:
P10D
= 10 ngàyP2M3D
= hai tháng 3 ngày
Ví dụ, bạn sinh 20/11/1999 thì sau đó 20 năm, 5 tháng, 3 ngày là ngày nào?
$ngaysinh = DateTime::createFromFormat('d/m/yy', '20/11/1999'); $ngaysinh->add(new DateInterval('P20Y5M3D')); echo $ngaysinh->format('d/m/Y'); // 23/04/2020
Ví dụ, hôm này là ngày 20/11/2000 trước đó 60 ngày là ngày nào, thứ mấy?
$day_cal = DateTime::createFromFormat('d/m/Y', '20/11/2000'); $day_cal->sub(new DateInterval('P60D')); echo $day_cal->format('l - d/m/Y'); // Thursday - 21/09/2000