2009-11-24 2 views
1

Вы знаете, когда поздно ночью, и ваш мозг жарится? У меня сейчас одна из тех ночей, и моя функция пока не работает должным образом, поэтому, пожалуйста, взгляните на нее: (Я должен отметить, что я использую PHP 5.2.9, а функция/метод DateTime:Diff() пока не доступен до PHP 5.3.0.Получите разницу между двумя временами (эпоха Unix)

<?php 
    function time_diff($ts1, $ts2) { 
     # Find The Bigger Number 
     if ($ts1 == $ts2) { 
      return '0 Seconds'; 
     } else if ($ts1 > $ts2) { 
      $large = $ts1; 
      $small = $ts2; 
     } else { 
      $small = $ts1; 
      $large = $ts2; 
     } 
     # Get the Diffrence 
     $diff = $large - $small; 
     # Setup The Scope of Time 
     $s = 1;   $ss = 0; 
     $m = $s * 60; $ms = 0; 
     $h = $m * 60; $hs = 0; 
     $d = $h * 24; $ds = 0; 
     $n = $d * 31; $ns = 0; 
     $y = $n * 365; $ys = 0; 
     # Find the Scope 
     while (($diff - $y) > 0) { $ys++; $diff -= $y; } 
     while (($diff - $n) > 0) { $ms++; $diff -= $n; } 
     while (($diff - $d) > 0) { $ds++; $diff -= $d; } 
     while (($diff - $h) > 0) { $hs++; $diff -= $h; } 
     while (($diff - $m) > 0) { $ms++; $diff -= $m; } 
     while (($diff - $s) > 0) { $ss++; $diff -= $s; } 
     # Print the Results 
     return "$ys Years, $ns Months, $ds Days, $hs Hours, $ms Minutes & $ss Seconds."; 
    } 
    // Test the Function: 
    ediff(strtotime('December 16, 1988'), time()); 
    # Output Should be: 
    # 20 Years, 11 Months, 8 Days, X Hours, Y Minutes & Z Seconds. 
?> 
+1

Почему это сообщество wiki ??? – Zak

+1

Я не хотел получать кредит на вопрос. –

ответ

1

Как об этом:

function time_diff($t1, $t2) 
{ 
    $totalSeconds = abs($t1-$t2); 
    $date = getdate($totalSeconds); 
    $firstYear = getdate(0); 
    $years = $date['year']-$firstYear['year']; 
    $months = $date['mon']; 
    $days = $date['mday']; 
    $hours = $date['hour']; 
    $minutes = $date['minutes']; 
    $seconds = $date['seconds']; 

    return "$years Years, $months Months, $days Days, $hours Hours, $minutes Minutes & $seconds Seconds."; 
} 

Это использует разность указанного времени в качестве даты. Затем вы можете позволить «getdate» выполнить всю работу за вас. Единственная проблема - это число лет - это просто год получения (разницы) минус год эпохи Unix (1970).

Если вам не нравится, используя фактический месяц, можно также разделить «год» день количество дней, в течение 12 месяцев равными

$months = $date['yday']/(365/12); 

Точно так же дни можно было высчитать оставшиеся дни с модуль

$days = $date['yday'] % (365/12); 
2

Это не ответ на ваш вопрос, но я просто хотел бы отметить ...

while (($diff - $y) > 0) { $ys++; $diff -= $y; } 

является очень неэффективным способ письменной информации

$ys = $diff/$y; 
$diff = $diff % $y; 

Кроме того, этот

 else if ($ts1 > $ts2) { 
       $large = $ts1; 
       $small = $ts2; 
     } else { 
       $small = $ts1; 
       $large = $ts2; 
     } 
     # Get the Diffrence 
     $diff = $large - $small; 

можно легко переписать в виде

$diff = abs($ts1 - $ts2); 

У меня есть ощущение, что проблема в вашем коде будет более очевидным, если он был менее многословным. :)

+2

Подсчет $ diff в то же время здесь. Вероятно, это должно быть $ ys = $ diff/$ y; $ diff = $ diff - $ ys * YEARS_IN_SECONDS, или независимо от константы. –

+1

Ах, хорошо, хороший звонок. Я попытался исправить это, используя оператор mod. – Parappa

+0

Делал это для ...5 лет, и я до сих пор пишу какой-то ужасный код. Это когда-нибудь закончится? Спасибо вам обоим за ваши комментарии. –

2

как об упрощении первой части с помощью простого

$diff = abs($ts2 - $ts1); 

Затем, когда вы это делаете:

$n = $d * 31; $ns = 0; 
$y = $n * 365; $ys = 0; 

вы на самом деле говорите, что год состоит из 365 31 дня месяцы. что на самом деле составляет около 36 лет. Наверное, не то, что ты хочешь.

Наконец, мы все взрослые здесь. Пожалуйста, используйте выращенные имена переменных, т. Е. $ YEAR_IN_SECONDS вместо $ ys. Как вы можете ясно видеть, вы можете писать код один раз, но 20 других schmucks придется читать его много раз.

+0

+1. Ты подтолкнул меня на это. :) – Parappa

+0

Должен признаться, я никогда не думал об использовании функции abs, поскольку я никогда не использовал ее сам. Хороший указатель, спасибо. –

2

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

function MonthsBetweenTimeStamp($t1, $t2) { 
    $monthsYear = array(); 
    $lastYearMonth = strtotime(gmdate('F-Y', $t2)); 
    $startYearMonth = strtotime(gmdate('F-Y', $t1)); 
    while ($startYearMonth < $lastYearMonth) { 
     $monthsYear[] = gmdate("F-Y", $startYearMonth); 
        //Increment of one month directly 
     $startYearMonth = strtotime(gmdate("F-Y", $startYearMonth) . ' + 1 month'); 
    } 

    if (empty($monthsYear)) { 
     $monthsYear = array($startYearMonth)); 
    } 

    return $monthsYear; 
Смежные вопросы