Tính thời gian trong php
Hàm time / microtime lấy giờ hiện tại trong PHPHà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) Show
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 . ' 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ángHà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 PHPHàm date($format,$timestamp) Trong đó:
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 PHPLớ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ố
Đọc dữ liệu từ DateTimeCó các phương thức sau hay dùng để lấy dữ liệu từ DateTime:
$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 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'), ' 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 DateTimeBạ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 DateTimeSử 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 DateTimeBạ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 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:
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 |