2010-02-03 3 views
4

Как я могу преобразовать разницу метки времени между 2 датамиPHP Преобразование метки времени до нескольких месяцев и дней

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

на месяцы и дни количество по желанию выводе:

$res = 4.05 //-> 4 months and 5 days 
+0

Дело в том, что мне нужно рассчитать, сколько лет является ПУНКТОМ на основе ввода пользователем производственного дня, месяца и года. Точность - это месяцы. Например, 4 года и 5 месяцев. Плохо то, что сервер PHP <5.3.0, поэтому я не могу использовать функцию DateTime diff. – Blackbeard

+0

Вам нужно сделать PHP <5.3 более заметным в своем вопросе, например, в заголовке –

ответ

1

Самая большая проблема, которую вы собираетесь лицо здесь определяет месяцы. Собираетесь ли вы использовать 4 недели = 1 месяц, 30 дней = 1 месяц и т. Д. У меня возникнет соблазн либо оставить цифру в течение нескольких дней, либо не более, конвертировать в недели и дни

2

Timestamp на самом деле это количество секунд с момента Unix Epoch, т.е. 1 января 1970 года. Таким образом, различия в метках времени - это секунды. Поэтому для преобразования секунд в несколько дней вам просто нужно разделить его на количество секунд в день, то есть $ Timestamp/(24x60x60). То же самое за месяц $ Временная метка/(24x60x60x30)

+0

Предполагая, что вы определяете 1 месяц равным 30 дням. – ZombieSheep

1

Я не думаю, что это доступно на php. Поэтому вам придется использовать целочисленное деление (или нормальное деление) и оператор modulo.

Например (пример использует часов вместо мс, но это тот же самый трюк повторяется):

$totalhours = 27; 
$days = round($totalhours/24); 
$hours = $totalhours % 24; 

Это даст $ дней = 1 и $ ч = 3

Как указано в других ответах , Найти месяцы сложнее, потому что количество дней в месяц не фиксировано.

+0

Любой шанс, что я могу сделать это с запросом MySQL? – Blackbeard

+0

Не все дни имеют 24 часа. – rjp

+0

На самом деле у Mysql есть несколько функций, которые могут вам помочь, кажется, это то, что вы ищете (посмотрите страницу на несколько других полезных функций): http://dev.mysql.com/doc/refman/5.1/en/ date-and-time-functions.html # function_timediff Как и для всех дней, имеющих 24 часа: если вы игнорируете секунды прыжка, все дни в UTC имеют 24 часа, 23 и 25 часов происходят только во время летнего времени, есть – Thirler

7

Возможно, что-то подобное. Моя математика может быть немного отключена.

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

define('DAY',60*60*24, true); 
define('MONTH',DAY*30, true); 
define('YEAR',DAY*365, true); 

$years = floor($diff/(YEAR)); 
$months = floor(($diff - $years * YEAR)/(MONTH)); 
$days = floor(($diff - $years * YEAR - $months*MONTH)/(DAY)); 
+0

Я предполагаю, что будет разница в течение месяцев, имеющих 31 день. – Blackbeard

+2

и никогда не пытайтесь это делать для временных интервалов, содержащих февраль, для которых иногда бывает 1 день, иногда 2. Конечно, если точность не так важна, она будет работать – dbemerlin

4

Вы не можете подойти к нему так же, как длина месяца варьируется - если вы не хотите сделать предположение, основанное на средней длине месяца. Если вам нужна правильная разница, вам нужно использовать фактические даты, то вы можете использовать php date diff - http://www.php.net/manual/en/datetime.diff.php

+0

К сожалению, доступно в PHP 5> = 5.3.0, иначе я бы конечно. – Blackbeard

1

Возможно, вы захотите взглянуть на DateTime.diff, так как он может выразить различия, которые вы ожидаете от человека, когда сравнение месяцев (например, с 01.01.2010 по 01.03.2010 - разница (ровно) три месяца).

3

Для PHP 5.3 вы можете использовать
http://de.php.net/manual/en/datetime.diff.php

Для более низких версий вы можете использовать что-то вроде: (простого решения, не быстро или лучше)

$days = 0; 
$months = 0; 
$month = date("n", $time1); 
while ($time1 < $time2) 
{ 
    ++$days; 
    if (date("n", $time1) != $month) 
    { 
     $month = date("n", $time1); 
     $days = 0; 
     $months++; 
    } 
    $time1 = mktime(0, 0, 0, date("n", $time1), date("j", $time1) + 1, date("Y")); 
} 

// Отказ от ответственности: непроверенный

+0

К сожалению, возвращается неправильное количество месяцев. Спасибо, в любом случае. – Blackbeard

+0

Должно быть правильно сейчас (если я еще не смешал параметры даты()) – dbemerlin

1

Вы можете рассчитать разницу во времени дня, используя функцию

function diff_date_day($day , $month , $year , $day2 , $month2 , $year2){ 
    $timestamp = mktime(0, 0, 0, $month, $day, $year, 0); 
    $timestamp2 = mktime(0, 0, 0, $month2, $month2, $year2); 
    $diff = floor(($timestamp - $timestamp2)/(3600 * 24)); 
    return $diff; 
} 

Сделать предположение в среднем месяце 30 дней и рассчитать количество месяцев. Этого может быть достаточно для некоторых потребностей (показывая возраст комментариев блога и т. Д.) И полностью непригодных для других.

0

Найдено решение с использованием MySQL для расчета месяцев:

ВЫБОР TIMESTAMPDIFF (МЕСЯЦ, '{$ start_time_str}', '{$ end_time_str}') AS м

Благодаря всем заинтересованным сторонам.

+1

Приятное боковое мышление! – PhoebeB

+1

Замечательно, что вы нашли решение * своей * проблемы, но это решение не затрагивает * проблему, поставленную в вашем вопросе *, вот как найти разницу в месяцах в PHP <5.3. Этот пост до сих пор не разрешен ... –

0

Я знаю, что это уже сейчас, но я натолкнулся на него, когда искал что-то, чтобы рассчитать разницу во времени в формате «3 года & 6 месяцев» из данного дамба в формате timestamp. Я написал следующее, которое может показаться полезным.

// Determine age 
$time_start = 'YOUR DOB'; 
$time_end = strtotime('today'); 
$years = 0; 
$months = 0; 
while ($time_start < $time_end){ 
    $tmp_time = strtotime('+ 1 year', $time_start); 
    if ($tmp_time < $time_end){ 
     $years++; 
     $time_start = $tmp_time; 
    } else { 
     $tmp_time = strtotime('+ 1 month', $time_start); 
     if ($tmp_time < $time_end){ 
      $months++; 
      $time_start = $tmp_time; 
     } else { 
      $time_start = $time_end; 
     } 
    } 
} 
$age = $years.' years &amp; '.$months.' months';