Tag Archive พีเอชพี

Byphunsanit

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

Byphunsanit

นับ เดือนโดย 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