В PHP как мне получить точное (не приблизительное) общее количество недель, месяцев и лет между двумя временными метками? - PullRequest
2 голосов
/ 04 марта 2020

Я могу сделать это за дней так:

$d1 = new DateTime('2000-01-01 12:00:00');
$d2 = new DateTime('2020-01-01 12:00:00');
$diff = $d2->diff($d1);
echo $diff->days;

Другими словами, это работает на дней . Однако класс DateTime / DateInterval имеет только переменную $ days - это ожидается, но не существует :

$diff->weeks;
$diff->months;
$diff->years;

Читая руководство, вы, на первый взгляд, можете быть обмануты, думая, что оно обладает следующими атрибутами: https://www.php.net/manual/en/class.dateinterval.php

public integer $y ;
public integer $m ;
public integer $d ;
public integer $h ;
public integer $i ;
public integer $s ;
public float $f ;
public integer $invert ;
public mixed $days ;

y, m, d, h, i, s не существует "отдельных итогов", а зависит друг от друга. Например, если промежуток времени равен ровно одному году, $ y будет равен 1, но все остальные будут равны 0 вместо их соответствующих представлений (12 месяцев, 52 недели и т. Д. c.).

Они обрабатывают дни специально по какой-то причине, включая переменную $ days, которая показывает фактическое общее количество дней. Я хочу это и для недель, месяцев и лет.

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

Я хочу знать точное общее число число недель между двумя временными метками и одно и то же годами и месяцами, независимо друг от друга.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Это вернет точную разницу между двумя днями, надеюсь, это поможет вам.

$time_diffrence=getDiffrenceBetweenTwoDays($date1,$date2); 

function getDiffrenceBetweenTwoDays($date1,$date2){
    $etime = strtotime($date1) - strtotime($date2;

    if ($etime < 1)
    {
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
                );
    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
            return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) .''  ;
        }
    }
}
0 голосов
/ 04 марта 2020

Замените% a любым из следующих ссылок по этой ссылке:

FORMATS

$d1 = date_create('2000-01-01 12:00:00');
$d2 = date_create('2020-01-01 12:00:00');
$diff = date_diff($d1, $d2);

$days = $diff->format('%a');
echo $days; // 7305
...