Ngu ngơ học làm web (69) - Bài tập về thời gian 1

Tiếp theo của: Ngu ngơ học làm web (68) - Datepicker
------

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]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web