------
Phần 69. Bài
tập về thời gian 1
Đây là clip số 57:
Nội dung bài tập:
- Định dạng lại cách hiển thị ngày tháng khi sử dụng
Datepicker
- Hiển thị thời gian dạng: 01:57 PM Thứ 6, ngày 25/11/2016
- Kiểm tra năm nhuận
- Tìm số ngày trong tháng, của một năm nào đó
- Xác định khoảng thời gian đã trôi qua
Để chuyển thời gian từ kiểu chuỗi về kiểu timestamp, sử dụng
hàm strtotime(time). Tuy nhiên, hàm này không phải khi nào cũng cho ra kết quả
đúng, nên sử dụng hàm khác.
Tại sao phải đổi thời gian từ dạng chuỗi (ví dụ ‘26 November
2016’) sang kiểu timestamp (ví dụ 1480093200),
lý do là để dễ xử lý, ví dụ hàm chuyển đổi kiểu định dạng ngày tháng date() chỉ
thực hiện được trên timestamp.
Ví dụ,
echo 'Output: '.date('d-m-Y', strtotime('26 November 2016'));
Để chuyển thời gian từ kiểu chuỗi về kiểu timestamp, nên sử
dụng hàm date_parse_from_format(format, date).
Ví dụ,
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'],
$date['year']);
Đây là đoạn mã minh họa việc đổi qua lại giữa một số định
dạng về ngày tháng:
<?php
echo 'Input:
'.$date.'<br>';
// chuyển từ dạng
chuỗi về dạng mảng
$date =
date_parse_from_format('d-m-Y', $date);
// chuyển từ dạng
mảng thành dạng timestamp (dạng số)
$timestamp =
mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);
// định dạng hiển thị
theo ý muốn (dạng chuỗi)
echo 'Output:
'.date('m-d-Y', $timestamp);
?>
Bài tập, định dạng và xuất thời gian theo mẫu sau: 01:57 PM
Thứ 6, ngày 25/11/2016
Hàm date('h:i A D, d-m-Y',time()); sẽ xuất ra màn hình là 10:04 AM Sat, 26-11-2016
Đoạn mã của bài
tập,
<?php
$arrEn = array('Mon',
'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
$arrVi = array('Thứ 2',
'Thứ 3', 'Thứ 4', 'Thứ 5', 'Thứ 6', 'Thứ 7', 'Chủ nhật');
$result = date('h:i A D,
d-m-Y',time());
$result =
str_replace($arrEn, $arrVi, $result);
$result =
str_replace(',', ', ngày', $result);
echo $result;
?>
Ở đoạn mã trên, có cách khác để xuất chữ ‘ngày’ là:
$result = date('h:i A D, \n\g\à\y d-m-Y',time());
Đây là clip số 58:
Để kiểm tra có phải là năm nhuận hay không, sử dụng hàm
checkdate của PHP, ý tưởng là kiểm tra xem năm đó có ngày 29/2 không? Nếu có,
thì là năm nhuận.
Ví dụ,
<?php
$year = 2016;
if(checkdate(2, 29,
$year)) {
echo 'Là năm nhuận';
}else {
echo 'Không là năm
nhuận';
}
echo $result;
?>
Để xác định một tháng có bao nhiêu ngày sử dụng hàm date()
như sau:
<?php
$year = 2016;
$month = 2;
$timestamp = mktime(0, 0,
0, $month, 1, $year);
$totalDays = date('t',
$timestamp);
echo $totalDays;
?>
Tính khoảng thời gian đã trôi qua tính từ một thời điểm.
Đây là clip số 59:
Tính khoảng thời gian đã trôi qua tính từ một thời điểm
(tiếp).
Lưu lại đoạn mã để tham khảo:
<?php
$timePost = '26/11/2016
16:06:05';
$timeReply = '28/11/2016
18:08:06';
// đổi thời gian từ chuỗi
-> mảng
$arrPost =
date_parse_from_format('d/m/Y H:i:s', $timePost);
$arrReply =
date_parse_from_format('d/m/Y H:i:s', $timeReply);
// đổi thời gian từ mảng
-> timestamp
$tsPost = mktime($arrPost['hour'],
$arrPost['minute'], $arrPost['second'], $arrPost['month'], $arrPost['day'],
$arrPost['year']);
$tsReply =
mktime($arrReply['hour'], $arrReply['minute'], $arrReply['second'],
$arrReply['month'], $arrReply['day'], $arrReply['year']);
$interval = $tsReply -
$tsPost;
$result = '';
switch ($interval) {
case $interval < 60:
$result = ($interval
== 1) ? $interval.' second ago' : $interval.' seconds ago';
break;
case ($interval >=
60 && $interval < 3600):
$minute =
round($interval/60);
$result = ($minute ==
1) ? $minute.' minute ago' : $minute.' minutes ago';
break;
case ($interval >=
3600 && $interval < 86400):
$hour =
round($interval/3600);
$result = ($hour ==
1) ? $hour.' hour ago' : $hour.' hours ago';
break;
case
(round($interval/86400) == 1):
$result = 'Yesterday
at '.date('H:i:s', $tsReply);
break;
default:
$result = date('d/m/Y
\a\t H:i:s', $tsReply);
break;
}
echo $result;
?>
-----------
Cập nhật [14/9/2020]
-----------