Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] php|Преобразовать секунды в дату (http://forum.oszone.net/showthread.php?t=161817)

morgan1991 29-12-2009 13:36 1306896

php|Преобразовать секунды в дату
 
Вообщем проблема в следующем:
Имеется переменная $All, в ней хранится кол-во секунд (разница между двумя датами)
Нужно преобразовать их в нормальную дату в следующем виде:
PHP код:

$Year
$Day
$Hour
$Minutes
$Second 

Т.е. ск-ко лет, дней, часов, минут, секунд...
НО $Year+$Day+$Hour+$Minutes+$Second не должно быть равно $All
Уже запарился считать. исписал четыре тетрадных листа.
Пробовал так:
PHP код:

$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)); 

не пашет...
Помогите пожалуйста, работа стынет...

Sham 29-12-2009 14:27 1306941

Годы считаются только с учетом реальных дат (нужно учитывать високосные годы). Так что считайте исходя из дней (там все четко 24 часа). А уже в конце расчетов можно годы из дней примерно подсчитать (~365.25 дня вроде). Т.е. сразу с all/86400 начните...

morgan1991 29-12-2009 14:41 1306955

Sham, не, здесь это не важно, возьмём год за 365 дней...

Sham 29-12-2009 15:07 1306974

Цитата:

Цитата morgan1991
Имеется переменная $All, в ней хранится кол-во секунд (разница между двумя датами) »

Цитата:

Цитата morgan1991
не, здесь это не важно, возьмём год за 365 дней »

all - это разница между двумя реальными датами, поэтому таки важно. Вы не сможете сказать, сколько лет содержится в этом all, потому что не имеете данных о високосных годах в этом промежутке all.

в целом в расчетах не вижу ошибок (только скобки в арифметических действиях необязательны - php понимает приоритеты)...

morgan1991 29-12-2009 15:47 1307011

Цитата:

Цитата Sham
поэтому таки важно »

мне сейчас главное вывести формулу, а потом уже сделаю с проверкой на год...
Цитата:

Цитата Sham
в целом в расчетах не вижу ошибок »

вот и я не вижу, а считает не правильно...

Sham 29-12-2009 16:12 1307019

Цитата:

Цитата morgan1991
а считает не правильно... »

приведите исходные данные и результаты

morgan1991 29-12-2009 16:22 1307024

PHP код:

<?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


Sham 29-12-2009 17:35 1307095

а если параметры местами поменять?

Цитата:

Цитата morgan1991
$All = $timestamp1 - $timestamp2; »

нужно вычитать из большего меньшее (или по модулю брать)

morgan1991 29-12-2009 19:09 1307145

Цитата:

Цитата Sham
нужно вычитать из большего меньшее (или по модулю брать) »

дак и так и так пробовал, результат не меняется...

Sham 29-12-2009 19:42 1307159

у меня работает, только $All в модуль возьмите...

Код:

У вас осталось:
Лет 0, Дней 0, Часов 20, Минут 43, Секунд 11


morgan1991 29-12-2009 23:19 1307272

Огромнейшее спасибо всем за помощь.
Может кому понадобится нашол ещё один способ:
PHP код:

$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


Igor_I 30-12-2009 00:14 1307296

PHP код:

<?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 )
       {
           
// 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" А так вроде как и ничего, работает :)

===
Исправил.


Время: 00:23.

Время: 00:23.
© OSzone.net 2001-