PHP конвертировать метку времени в месяцы и дни - PullRequest
4 голосов
/ 03 февраля 2010

Как мне преобразовать разницу между двумя датами

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

в количество месяцев и дней, как желаемый результат:

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

Ответы [ 10 ]

7 голосов
/ 03 февраля 2010

Нечто подобное могло бы сработать.Моя математика может быть немного не в порядке.

$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));
4 голосов
/ 03 февраля 2010

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

3 голосов
/ 03 февраля 2010

Для 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"));
}

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

2 голосов
/ 03 февраля 2010

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

1 голос
/ 03 февраля 2010

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

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 дней, и рассчитайте количество месяцев. Этого может быть достаточно для некоторых нужд (отображение возраста комментариев в блогах и т. Д.), А для других он совершенно не адаптирован.

1 голос
/ 03 февраля 2010

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

1 голос
/ 03 февраля 2010

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

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

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

Это даст $ days = 1 и $ hours = 3

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

1 голос
/ 03 февраля 2010

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

0 голосов
/ 28 мая 2012

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

// 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';
0 голосов
/ 03 февраля 2010

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

SELECT TIMESTAMPDIFF (MONTH, '{$ start_time_str}', '{$ end_time_str}') AS m

Спасибо всем, кто участвовал.

...