1

I want two date difference in number of days in php. Following is the code which works perfectly for rest of the given date except 32 in days. I know in english there is no 32 in days but i am using Nepali Date to store in db. In Nepali calendar there is 32 days also, so i need help from anyone.

   $dStart = new DateTime('2071-02-32');
   $dEnd  = new DateTime('2071-02-31');
   $dDiff = $dStart->diff($dEnd);
   echo $dDiff->days; //output should come 1 
Strawberry
  • 33,750
  • 13
  • 40
  • 57
S.d. Raju
  • 11
  • 1

2 Answers2

3

I Guess, you probably already using converter (Nepali Dates to English Dates), to handle them. If not, use this one Nepali Date Convert

and you can simply convert you nepali dates to english, before calculating difference, see example below:

$calendar = new Nepali_Calendar();
$date1 = $calendar->nep_to_eng('2071', '02', '32');
$date2 = $calendar->nep_to_eng('2071', '02', '31');

$dStart = DateTime::createFromFormat('Y-n-j', $date1['year'].'-'.$date1['month'].'-'.$date1['date']);
$dEnd  = DateTime::createFromFormat('Y-n-j', $date2['year'].'-'.$date2['month'].'-'.$date2['date']);
$dDiff = $dStart->diff($dEnd);
echo $dDiff->days;
kamal pal
  • 4,187
  • 5
  • 25
  • 40
0

Below code works fine:

function diff($time1, $time2, $precision = 6) {
    // If not numeric then convert texts to unix timestamps
    if (! is_int ( $time1 )) {
        $time1 = strtotime ( $time1 );
    }
    if (! is_int ( $time2 )) {
        $time2 = strtotime ( $time2 );
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2
    if ($time1 > $time2) {
        $ttime = $time1;
        $time1 = $time2;
        $time2 = $ttime;
    }

    // Set up intervals and diffs arrays
    $intervals = array (
            'year',
            'month',
            'day',
            'hour',
            'minute',
            'second' 
    );
    $diffs = array ();

    // Loop thru all intervals
    foreach ( $intervals as $interval ) {
        // Set default diff to 0
        $diffs [$interval] = 0;
        // Create temp time from time1 and interval
        $ttime = strtotime ( "+1 " . $interval, $time1 );
        // Loop until temp time is smaller than time2
        while ( $time2 >= $ttime ) {
            $time1 = $ttime;
            $diffs [$interval] ++;
            // Create new temp time from time1 and interval
            $ttime = strtotime ( "+1 " . $interval, $time1 );
        }
    }

    $count = 0;
    $times = array ();
    // Loop thru all diffs
    foreach ( $diffs as $interval => $value ) {
        // Break if we have needed precission
        if ($count >= $precision) {
            break;
        }
        // Add value and interval
        // if value is bigger than 0
        if ($value > 0) {
            // Add s if value is not 1
            if ($value != 1) {
                $interval .= "s";
            }
            // Add value and interval to times array
            $times [] = $value . " " . $interval;
            $count ++;
        }
    }

    // Return string with times
    return implode ( ", ", $times );
}

$startTime = '09-10-2017 10:30 AM';
$endTime = '19-10-2017 04:30PM';
// Run and print diff
echo 'Span: '.diff ( $startTime, $endTime, 6 );