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:

Bản định dạng cho hàm date()
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ề timestamp
  • getTimezone() 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ày
  • P2M3D = 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

Đăng ký nhận bài viết mới