Tag Archive interval

PHP วันที่ เวลา คำนวณ

ตัวอย่างการเพิ่ม ลด แสดงเวลา คำนวณ ช่วงเวลาใน php

<?php
$date = new DateTime('now');
echo '<br>วันเวลาปัจจุบัน ', $date->format('d/m/Y');
echo '<br>ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ ', $date->format('m/d/Y');
$dateUS = new DateTime('now', new DateTimeZone('America/New_York'));
echo '<br>เวลาของเค้าคือ ', $dateUS->format('m/d/Y H:i:s');
echo '<br>ถ้าเป็น MySQL จะเก็บแบบนี้ ', $date->format('Y-m-d H:i:s');
echo '<br>ถ้าเป็น ISO 8601 จะเก็บแบบนี้ ', $date->format('c');
echo '<br>ถ้าเป็น Unix จะเก็บแบบนี้ ', $date->format('U');
echo '<hr>';
echo '<br>เพิ่มอีก 1 วัน ', $date->modify('+1 day')->format('d/m/Y');
echo '<br>เพิ่มอีก 7 วัน ', $date->modify('+1 day')->format('d/m/Y');
echo '<br>เพิ่มอีก 1 เดือน ', $date->modify('+1 month')->format('d/m/Y');
echo '<br>เพิ่มอีก 1 ปี ', $date->modify('+1 year')->format('d/m/Y');
echo '<hr>';
echo '<br>ลดอีก 1 วัน ', $date->modify('-1 day')->format('d/m/Y');
echo '<br>ลดอีก 7 วัน ', $date->modify('-1 day')->format('d/m/Y');
echo '<br>ลดอีก 1 เดือน ', $date->modify('-1 month')->format('d/m/Y');
echo '<br>ลดอีก 1 ปี ', $date->modify('-1 year')->format('d/m/Y');
echo '<hr>';
$timeStart = DateTime::createFromFormat('d/m/Y', '5/8/1982');
echo '<br>ฉันเกิดวันที่ ', $timeStart->format('d/m/Y');
echo '<hr>';
echo '<br>อายุ ', $timeStart->diff($date)->format('%y'), ' ปี ', $timeStart->diff($date)->format('%m'), ' เดือน ', $timeStart->diff($date)->format('%d'), ' วัน';
echo '<br>คิดอายุเป็น ', $timeStart->diff($date)->format('%a'), ' วัน';
echo '<br>ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจุบันคือ xxx BETWEEN ', $timeStart->format('Y-m-d 00:00:00'), ' AND ', $date->format('Y-m-d 23:59:59');

ผลที่ได้

วันเวลาปัจจุบัน 11/11/2016
ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ 11/11/2016
เวลาของเค้าคือ 11/11/2016 14:29:35
ถ้าเป็น MySQL จะเก็บแบบนี้ 2016-11-11 20:29:35
ถ้าเป็น ISO 8601 จะเก็บแบบนี้ 2016-11-11T20:29:35+01:00
ถ้าเป็น Unix จะเก็บแบบนี้ 1478892575


เพิ่มอีก 1 วัน 12/11/2016
เพิ่มอีก 7 วัน 13/11/2016
เพิ่มอีก 1 เดือน 13/12/2016
เพิ่มอีก 1 ปี 13/12/2017


ลดอีก 1 วัน 12/12/2017
ลดอีก 7 วัน 11/12/2017
ลดอีก 1 เดือน 11/11/2017
ลดอีก 1 ปี 11/11/2016


ฉันเกิดวันที่ 05/08/1982


อายุ 34 ปี 3 เดือน 6 วัน
คิดอายุเป็น 12517 วัน
ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจะปัญคือ xxx BETWEEN 1982-08-05 00:00:00 AND 2016-11-11 23:59:59

ถ้าต้องการหาจำนวนเดือน ให้อ่าน นับ เดือนโดย PHP อ่านเพิ่มเติม date — Format a local time/date, The DateTimeZone class, The DateInterval class

นับ เดือนโดย PHP

หลายวันก่อนมีสมาชิกในชมรมคนทำเว็บโพสว่า php คิดเดือนให้ผิด เชื่อถือไม่ได้ เราก็ใช้ php มานาน ก็คิดว่าเค้าเขียน code ผิดรึเปล่า แต่เค้าก็บอกว่าลบ code ออกไปแล้ว แต่ก็ให้ตัวอย่างวันที่มา ลองเขียน code date_diff ดูมันนับผิดจริงๆ ลองไล่หาสาเหตุดูเข้าใจว่ามันคิดผิดเพราะนับเป็นวัน สาเหตุ คือ php จะแปลงวันที่เป็นตัวเลข timestamp อย่าง

  • 2010-04-28 22:41:43 = 1272508903
  • 2007-02-14 20:25:25 จะเป็น 1171502725

และแต่ละเดือนมีวันไม่เท่ากัน แถมบางปีเดือนกุมพาพันธ์ ก็มี 28 / 29 วัน แต่ date_diff ของ php เหมือนจะไม่ได้คิดเรื่องนี้ เอาเวลาตายตัวมาคิด ทำให้ต้องใช้วิธี แยกปี แยกเดือน แล้วเอามาใส่สูตรเอาเอง

<?php

$dateRanges = [
    ['01/02/2016', '01/03/2016'],
    ['01/02/2016', '01/04/2016'],
    ['01/11/2013', '30/11/2013'],
    ['01/01/2013', '31/12/2013'],
    ['31/01/2011', '28/02/2011'],
    ['01/09/2009', '01/05/2010'],
    ['01/01/2013', '31/03/2013'],
    ['15/02/2013', '15/04/2013'],
    ['01/02/1985', '31/12/2013'],
];

foreach ($dateRanges as $range) {
    list($dateStart, $dateEnd) = $range;

    $timeStart = DateTime::createFromFormat('d/m/Y', $dateStart);
    $timeEnd = DateTime::createFromFormat('d/m/Y', $dateEnd);

    $months = $timeStart->diff($timeEnd)->format('%m');

    echo '<br>', $dateStart, ' => ', $dateEnd, ' = ', $months, ' months';
}
echo '<hr>';
foreach ($dateRanges as $range) {
    list($dateStart, $dateEnd) = $range;

    $timeStart = DateTime::createFromFormat('d/m/Y', $dateStart);
    $timeEnd = DateTime::createFromFormat('d/m/Y', $dateEnd);

    $months = abs(($timeEnd->format('Y') - $timeStart->format('Y')) * 12 + ($timeEnd->format('m') - $timeStart->format('m')));

    echo '<br>', $dateStart, ' => ', $dateEnd, ' = ', $months, ' months';
}

ผลที่ได้คือ

  • 01/02/2016 => 01/03/2016 = 1 months
  • 01/02/2016 => 01/04/2016 = 2 months
  • 01/11/2013 => 30/11/2013 = 0 months
  • 01/01/2013 => 31/12/2013 = 11 months
  • 31/01/2011 => 28/02/2011 = 0 months
  • 01/09/2009 => 01/05/2010 = 8 months
  • 01/01/2013 => 31/03/2013 = 2 months
  • 15/02/2013 => 15/04/2013 = 2 months
  • 01/02/1985 => 31/12/2013 = 10 months

  • 01/02/2016 => 01/03/2016 = 1 months
  • 01/02/2016 => 01/04/2016 = 2 months
  • 01/11/2013 => 30/11/2013 = 0 months
  • 01/01/2013 => 31/12/2013 = 11 months
  • 31/01/2011 => 28/02/2011 = 1 months
  • 01/09/2009 => 01/05/2010 = 8 months
  • 01/01/2013 => 31/03/2013 = 2 months
  • 15/02/2013 => 15/04/2013 = 2 months
  • 01/02/1985 => 31/12/2013 = 346 months

เก็บ session ทำข้อสอบออนไลน์

ตัวอย่างระบบข้อสอบ online โดยนักเรียน นักศึกษา จะต้อง login ก่อนโดยจะเก็บข้อมูลส่วนตัว และลำดับคำถามไว้ในเซคชั่น

และเพราะว่า php ตั้งเวลาไว้ให้เซคชั่นมีอายุ 20 นาที แต่มีเวลาทำข้อสอบ 120 นาที ทำให้เซคชั่นหมดเวลาไปก่อน จึงต้องใช้ jQuery มาต่ออายุให้เซคชั่นทุกๆ 10 นาที เพื่อรักษาข้อมูลเอาไว้

ไฟล์แสดงข้อสอบ (ใช้จริงๆ ควรแยก javascript ไปไว้ในอีกที่หนึ่ง)

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>ข้อสอบ</title>
      <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
   </head>
   <body>
<?php
if (empty($_POST))
{
?>
      <div class="container">
         <h2>Vertical (basic) form</h2>
         <div class="row">
            <div class="col-md-2"><b>Stat :</b></div>
            <div class="col-md-2" id="startA"></div>
            <div class="col-md-2"><b>End :</b></div>
            <div class="col-md-2" id="endA"></div>
            <div class="col-md-2"><b>Last Update :</b></div>
            <div class="col-md-2" id="periodsA"></div>
         </div>
         <form id="examinationF" action="examination.php" method="post">
            <div class="form-group">
               <label for="name">Name :</label>
               <input type="text" name="name" id="name" class="form-control" placeholder="Enter your name">
            </div>
            <div class="form-group">
               <label for="surname">Surname :</label>
               <input type="text" name="surname" id="surname" class="form-control" placeholder="Enter your surname">
            </div>
            <div class="checkbox">
               <label><input type="checkbox" name="accept">พร้อมทำข้อสอบในเวลาที่กำหนด</label>
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
         </form>
      </div>
      <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
      <script>
         $(function(){

            /* keep session */
            function sessionPostpone()
            {
               $.ajax({
                  "cache" : false,
                  "type" : "post",
                  "success" : function(datas)
                  {
                     $('#endA').text(datas.time_end);
                     $('#periodsA').text(datas.update+ '('+datas.periods+')');
                     $('#startA').text(datas.time_start);
                  },
                  "url" : "session.php"
               });
            }

            sessionPostpone();
            var interval = 1000 * 60 * 10; // every 10 minutes
            setInterval(function(){
               sessionPostpone();
            }, interval);

            /* submit form */
            var timeout = 1000 * 60 * 120; // 120 minutes
            setTimeout(function () {
               $('#examinationF').submit();
            }, timeout);

         })
      </script>
<?php
}
else
{
   echo'<h1>คำตอบของคุณคือ</h1>',
   '<pre>',print_r($_POST, true),'</pre>';
}
?>
   </body>
</html>

ไฟล์ไว้เรียกดูข้อมูล และยืดอายุ session ออกไป

<?php
session_start();

$time = new DateTime();

if(! isset($_SESSION['id']))
{
	$datas = [];
	$_SESSION['id'] = session_id();
	$_SESSION['time_start'] = $time->format('H:i:s');

	$time_end = $time->modify('+2 hour');
	$_SESSION['time_end'] = $time_end->format('H:i:s');
	$_SESSION['time_end_timestamp'] = time($time_end);
}

$period = 10;
$_SESSION['periods'] = round((strtotime($_SESSION['time_end']) - time($time)) / 60 / $period);
$_SESSION['update'] = $time->format('H:i:s');

header("Content-type: application/json; charset=utf-8");
echo json_encode($_SESSION);