--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn Bài tập về thời gian. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Bài tập về thời gian. Hiển thị tất cả bài đăng

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

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

Phần 70. Bài tập về thời gian 2


Đây là clip số 60:


So sánh hai ngày bất kì. Ý tưởng là, cho người dùng nhập vào hai ngày, sau đó đổi hai ngày này sang dạng timestamp, thực hiện so sánh hai giá trị timestamp.

Đây là đoạn mã,

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Thời gian</title>
  <link rel="stylesheet" href="jquery-ui-1.12.1.custom/jquery-ui.css">
  <script src="jquery-ui-1.12.1.custom/external/jquery/jquery.js"></script>
  <script src="jquery-ui-1.12.1.custom/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#date-start" ).datepicker({ dateFormat: "dd/mm/yy" });
    $( "#date-end" ).datepicker({ dateFormat: "dd/mm/yy" });
  } );
  </script>
</head>
<body>
<?php
  $dateStart = (isset($_POST['date-start'])) ? $_POST['date-start'] : '';
  $dateEnd = (isset($_POST['date-end'])) ? $_POST['date-end'] : '';
?>
  <form action="#" method="post" id="mainForm" name="mainForm">
    <p>Start: <input readonly="readonly" type="text" name="date-start" id="date-start" value="<?php echo $dateStart; ?>"></p>
    <p>End: <input readonly="readonly" type="text" name="date-end" id="date-end" value="<?php echo $dateEnd; ?>"></p>
    <input type="submit" value="Submit">   
  </form>
<?php
  function compareDates($dateStart, $dateEnd) {
    $arrDateStart = date_parse_from_format('d/m/Y',  $dateStart);
    $tsStart = mktime(0, 0, 0, $arrDateStart['month'], $arrDateStart['day'], $arrDateStart['year']);

    $arrDateEnd = date_parse_from_format('d/m/Y',  $dateEnd);
    $tsEnd = mktime(0, 0, 0, $arrDateEnd['month'], $arrDateEnd['day'], $arrDateEnd['year']);
   
    $result = 0;
    if($tsEnd > $tsStart) {
      $result = 1;
    }else if ($tsEnd < $tsStart){
      $result = -1;
    }

    return $result;
  }

  if($dateStart != null && $dateEnd != null) {
    if(compareDates($dateStart, $dateEnd) == 0) {
      echo 'Start = End';
    }else if(compareDates($dateStart, $dateEnd) == 1) {
      echo 'Start < End';
    }else {
      echo 'Start > End';
    }
  }
?>

Đây là clip số 61:


Bài tập: cộng thêm giá trị cho thời gian. Ý tưởng là, cho người dùng nhập vào một giá trị ngày tháng năm bất kì, sau đó cho người dùng nhập một số bất kì và chọn đối tượng sẽ được cộng là ngày, tháng hay năm, cuối cùng thực hiện phép cộng và cập nhật lại giá trị ngày tháng năm.

Đây là đoạn mã,

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Thời gian</title>
  <link rel="stylesheet" href="jquery-ui-1.12.1.custom/jquery-ui.css">
  <script src="jquery-ui-1.12.1.custom/external/jquery/jquery.js"></script>
  <script src="jquery-ui-1.12.1.custom/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#date" ).datepicker({ dateFormat: "dd/mm/yy" });
  } );
  </script>
</head>
<body>
<?php
    function createSelectbox($name, $attributes, $array, $keySelect) {
      $xhtml = '';

      if(!empty($array)) {
        $xhtml .= '<select name="'.$name.'" id="'.$name.'" style="'.$attributes.'">';
        foreach ($array as $key => $value) {
          if($key == $keySelect) {
            $xhtml .= '<option value="'.$key.'"selected = "selected">'.$value.'</option>'; 
          } else {
            $xhtml .= '<option value="'.$key.'">'.$value.'</option>';
          }
        }
        $xhtml .= '</select>';
      }
      return $xhtml;
     }
    function addTime($date, $format, $type, $value) {
      $arrDate = date_parse_from_format($format, $date);
      switch ($type) {
        case 'Day':
          $ts = mktime(0, 0, 0, $arrDate['month'], $arrDate['day'] + $value, $arrDate['year']);
          break;
        case 'Month':
          $ts = mktime(0, 0, 0, $arrDate['month'] + $value, $arrDate['day'], $arrDate['year']);
          break;
        case 'Year':
        $ts = mktime(0, 0, 0, $arrDate['month'], $arrDate['day'], $arrDate['year'] + $value);
          break;
      }
      $result = date($format, $ts);
      return $result;
    }
    $arrTypes = array('---select type---', 'Day', 'Month', 'Year');
 
    $date     = (isset($_POST['date'])) ? $_POST['date'] : '';
    $type     = (isset($_POST['select-type'])) ? $_POST['select-type'] : '';
    $value    = (isset($_POST['value'])) ? $_POST['value'] : '';

    $strTypes = createSelectbox('select-type', 'width: 150px', $arrTypes, $type);
    $result = addTime($date, 'd/m/Y', $arrTypes[$type], $value);
  
?>
  <form action="#" method="post" id="mainForm" name="mainForm">
    <p>Date: <input readonly="readonly" type="text" name="date" id="date" value="<?php echo $date; ?>"></p>
    <p>Type: <?php echo $strTypes; ?></p>
    <p>Value: <input type="text" name="value" id="value" value="<?php echo $value; ?>"></p>
    <p><?php echo $result; ?></p>
    <input type="submit" value="Submit">   
  </form>
</body>

</html>
-----------
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

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