Показать полную графическую версию : [решено] php|Преобразовать секунды в дату
morgan1991
29-12-2009, 13:36
Вообщем проблема в следующем:
Имеется переменная $All, в ней хранится кол-во секунд (разница между двумя датами)
Нужно преобразовать их в нормальную дату в следующем виде:
$Year
$Day
$Hour
$Minutes
$Second
Т.е. ск-ко лет, дней, часов, минут, секунд...
НО $Year+$Day+$Hour+$Minutes+$Second не должно быть равно $All
Уже запарился считать. исписал четыре тетрадных листа.
Пробовал так:
$Year = floor($All/31536000);
$Ost = ($All-($Year*31536000));
$Day = floor($Ost/86400);
$Ost = ($Ost-($Day*86400));
$Hour = floor($Ost/3600);
$Ost = ($Ost-($Hour*3600));
$Minutes = floor($Ost/60);
$Second = ($Ost-($Minutes*60));не пашет...
Помогите пожалуйста, работа стынет...
Годы считаются только с учетом реальных дат (нужно учитывать високосные годы). Так что считайте исходя из дней (там все четко 24 часа). А уже в конце расчетов можно годы из дней примерно подсчитать (~365.25 дня вроде). Т.е. сразу с all/86400 начните...
morgan1991
29-12-2009, 14:41
Sham, не, здесь это не важно, возьмём год за 365 дней...
Имеется переменная $All, в ней хранится кол-во секунд (разница между двумя датами) »
не, здесь это не важно, возьмём год за 365 дней »
all - это разница между двумя реальными датами, поэтому таки важно. Вы не сможете сказать, сколько лет содержится в этом all, потому что не имеете данных о високосных годах в этом промежутке all.
в целом в расчетах не вижу ошибок (только скобки в арифметических действиях необязательны - php понимает приоритеты)...
morgan1991
29-12-2009, 15:47
поэтому таки важно »
мне сейчас главное вывести формулу, а потом уже сделаю с проверкой на год...
в целом в расчетах не вижу ошибок »
вот и я не вижу, а считает не правильно...
а считает не правильно... »
приведите исходные данные и результаты
morgan1991
29-12-2009, 16:22
<?php
function DifferenceDate($Date1, $Date2)
{
$TempDatePart = explode('-', $Date1);
$DateMas1[0] = $TempDatePart[0];
$DateMas1[1] = $TempDatePart[1];
$TempDatePart = explode(' ', $TempDatePart[2]);
$DateMas1[2] = $TempDatePart[0];
$TempDatePart = explode(':', $TempDatePart[1]);
$DateMas1[3] = $TempDatePart[0];
$DateMas1[4] = $TempDatePart[1];
$DateMas1[5] = $TempDatePart[2];
$TempDatePart = explode('-', $Date2);
$DateMas2[0] = $TempDatePart[0];
$DateMas2[1] = $TempDatePart[1];
$TempDatePart = explode(' ', $TempDatePart[2]);
$DateMas2[2] = $TempDatePart[0];
$TempDatePart = explode(':', $TempDatePart[1]);
$DateMas2[3] = $TempDatePart[0];
$DateMas2[4] = $TempDatePart[1];
$DateMas2[5] = $TempDatePart[2];
$timestamp1 = (mktime($DateMas1[3], $DateMas1[4], $DateMas1[5], $DateMas1[1], $DateMas1[2], $DateMas1[0]));
$timestamp2 = (mktime($DateMas2[3], $DateMas2[4], $DateMas2[5], $DateMas2[1], $DateMas2[2], $DateMas2[0]));
$All = $timestamp1 - $timestamp2;
$Year = floor($All/31536000);
$Ost = ($All-($Year*31536000));
$Day = floor($Ost/86400);
$Ost = ($Ost-($Day*86400));
$Hour = floor($Ost/3600);
$Ost = ($Ost-($Hour*3600));
$Minutes = floor($Ost/60);
$Second = ($Ost-($Minutes*60));
$Massive[0] = $Year;
$Massive[1] = $Day;
$Massive[2] = $Hour;
$Massive[3] = $Minutes;
$Massive[4] = $Second;
return $Massive;
}
$Massives = DifferenceDate('2009-12-29 16:20:49', '2009-12-30 13:04:00');
echo "У вас осталось:<br>";
echo "Лет ".$Massives[0].", ";
echo "Дней ".$Massives[1].", ";
echo "Часов ".$Massives[2].", ";
echo "Минут ".$Massives[3].", ";
echo "Секунд ".$Massives[4];
?>
Выводит:
У вас осталось:
Лет -1, Дней 364, Часов 3, Минут 16, Секунд 49
а если параметры местами поменять?
$All = $timestamp1 - $timestamp2; »
нужно вычитать из большего меньшее (или по модулю брать)
morgan1991
29-12-2009, 19:09
нужно вычитать из большего меньшее (или по модулю брать) »
дак и так и так пробовал, результат не меняется...
у меня работает, только $All в модуль (http://docs.php.net/manual/ru/function.abs.php) возьмите...
У вас осталось:
Лет 0, Дней 0, Часов 20, Минут 43, Секунд 11
morgan1991
29-12-2009, 23:19
Огромнейшее спасибо всем за помощь.
Может кому понадобится нашол ещё один способ:
$Year = floor($All/31536000);
$Xsec = $All-$Year*31536000;
$Day = floor($Xsec/86400);
$Yday = $Xsec-$Day*86400;
$Hour = floor($Yday/3600);
$Zhour = $Yday-$Hour*3600;
$Minutes = floor($Zhour/60);
$Second = $Zhour-$Minutes*60;
<?php
function duration( $date1, $date2, $if_reached=null )
{
$int_seconds = strtotime ( $date2 ) - strtotime ( $date1 );
$key_suffix = 's';
$periods = array(
# 'year' => 31557600, // 1 year = 365.25 day
'year' => 31536000, // 1 year = 365 day
# 'month' => 2629800, // 1 month = 1/12 year
'month' => 2628000, // 1 month = 1/12 year
'day' => 86400,
'hour' => 3600,
'minute' => 60,
'second' => 1
);
// used to hide 0's in higher periods
$flag_hide_zero = true;
// do the loop thang
foreach( $periods as $key => $length )
{
// calculate
$temp = floor( $int_seconds / $length );
#echo '-'.$temp;
// determine if temp qualifies to be passed to output
if( !$flag_hide_zero || $temp > 0 )
{
// store in an array
$build[] = $temp.' '.$key.($temp!=1?'s':null);
// set flag to false, to allow 0's in lower periods
$flag_hide_zero = false;
}
// get the remainder of seconds
$int_seconds = fmod($int_seconds, $length);
}
// return output, if !empty, implode into string, else output $if_reached
return ( !empty($build) ? implode(', ', $build):$if_reached );
}
echo duration ('2009-12-29 16:20:49', '2010-12-29 16:21:00');
?>
Но всё-таки есть небольшой косяк, в примере на самом деле разница практически составляет 365 дней. Плюс 11 секунд, но из-за високосных годов год равен не 365 дней, а 365.25. Вот и получилось "11 months, 30 days, 4 hours, 30 minutes, 11 seconds" А так вроде как и ничего, работает :)
===
Исправил.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.