2012-06-22 2 views
0

Я работаю над месяцами, днями, часами и минутами между двумя датами, я успешно получил его, чтобы выработать месяцы, дни и минуты, но я не могу на всю жизнь заставить его работать ниже, мой код.PHP разность минут минут

<?php 
    $date1 = "2012-07-01 00:00:00"; 
    $date2 = "2012-09-30 00:00:00"; 

    $diff = abs(strtotime($date2) - strtotime($date1)); 

    $years = floor($diff/(365*60*60*24)); 
    $months = floor(($diff - $years * 365*60*60*24)/(30*60*60*24)); 
    $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); 
    $minutes = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/(60*60*24)/(60*60)); 

    printf("%d years, %d months, %d days, %d minutes\n", $years, $months, $days, $minutes); 

?> 

ответ

1

Лучшим и наиболее точным способом решения этой проблемы является использование класса DateTime. В противном случае вы столкнетесь с проблемами, когда имеете дело с аномалиями в датах (високосный год и т. Д.).

$format = 'Y-m-d h:i:s'; 
$tz = new DateTimeZone('America/New_York'); 

// Create DateTime objs based on the above format 
$t1 = DateTime::createFromFormat($format, "2012-07-01 00:00:00", $tz); 
$t2 = DateTime::createFromFormat($format, "2012-09-30 00:00:00", $tz); 

// Find the difference between them 
$diff = $t1->diff($t2); 

// Print out the difference in each amount 
$outputs = array('Y' => 'Year', 'm' => 'Month', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'seconds'); 

foreach($outputs as $key => $value) 
    echo $diff->format('%'.$key) . ' ' . $value . "\n"; 

Это outputs:

00 Year 
2 Month 
29 day 
0 hour 
0 minute 
0 seconds 
0

Используется, чтобы иметь одну из следующих функций, чтобы преобразовать секунды в дни/недели/чч: время сс и т.д. Это должно ответить на ваш запрос: мм.

function duration ($sec, $padHours = false) { 
    if ($sec > 1209600) return "> ". intval(intval($sec)/604800) . " weeks"; 
    if ($sec > 604800) return "1 week"; 
    if ($sec > 172800) return "> ". intval(intval($sec)/86400) . " days"; 
    if ($sec > 86400) return "1 day"; 
    $hms = ""; 
    $hours = intval(intval($sec)/3600); 
    $hms .= ($padHours) 
     ? str_pad($hours, 2, "0", STR_PAD_LEFT). ":" 
     : $hours. ":"; 
    $minutes = intval(($sec/60) % 60); 
    $hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT). ":"; 
    $seconds = intval($sec % 60); 
    $hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT); 
    return $hms; 

} 
1

Попробуйте уменьшить вашу $diff переменную, как вы работаете все остальное из:

$years = floor($diff/31557600); // 31557600 = 365.25 * 86400 
$diff -= $years * 31557600; 
// I'd skip months, since different months have a different number of days. 
// If you *really* want it, calculate the number of months from the days below. 
$days = floor($diff/86400); // 86400 = 24 * 3600 
$diff -= $days * 86400; 
$hours = floor($diff/3600); // 3600 = 60 * 60 
$diff -= $days * 3600; 
$minutes = floor($diff/60); 
$diff -= $minutes * 60; 
// $diff now equals the number of seconds left over 

Кроме того, обратите внимание на РНР Date/Time object:

$date1 = new DateTime("2012-07-01 00:00:00"); 
$date2 = new DateTime("2012-09-30 00:00:00"); 
$diff = $date1->diff($date2); // $diff is a DateInterval object 

Посмотрите на DateInterval->format(), чтобы определить, как вы хотите форматировать ваш выход от $diff.

Смежные вопросы