Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблемы с датой: Юникс, Стамп и т.д


Автор: HappyMan 26.2.2005, 23:36
Вобщем столкнулся с проблемой сравнения дат, времени...
Мне нужно найти разницу в днях между двумя датами, но начались каки-то проблемы с преобразованиями дат.. кароче ничего не получилось... Начал искать на этом форуме, но нужного не нашел. тогда начал бороздить просторы Инета и нашел такое:

Код

<?

// This is a simple script to calculate the difference between two dates
// and express it in years, months and days
//
// use as in: "my daughter is 4 years, 2 month and 17 days old" ... :-)
//
// Feel free to use this script for whatever you want
//
// version 0.1 / 2002-10-3
//
// please send comments and feedback to webmaster@lotekk.net
//

// ****************************************************************************

// configure the base date here
$base_day                = 11;                // no leading "0"
$base_mon                = 5;                // no leading "0"
$base_yr                = 2001;                // use 4 digit years!

// get the current date (today) -- change this if you need a fixed date
$current_day                = date ("j");
$current_mon                = date ("n");
$current_yr                = date ("Y");

// and now .... calculate the difference! :-)

// overflow is always caused by max days of $base_mon
// so we need to know how many days $base_mon had
$base_mon_max                = date ("t",mktime (0,0,0,$base_mon,$base_day,$base_yr));

// days left till the end of that month
$base_day_diff                 = $base_mon_max - $base_day;

// month left till end of that year
// substract one to handle overflow correctly
$base_mon_diff                 = 12 - $base_mon - 1;

// start on jan 1st of the next year
$start_day                = 1;
$start_mon                = 1;
$start_yr                = $base_yr + 1;

// difference to that 1st of jan
$day_diff        = ($current_day - $start_day) + 1;         // add today
$mon_diff        = ($current_mon - $start_mon) + 1;        // add current month
$yr_diff        = ($current_yr - $start_yr);

// and add the rest of $base_yr
$day_diff        = $day_diff + $base_day_diff;
$mon_diff        = $mon_diff + $base_mon_diff;

// handle overflow of days
if ($day_diff >= $base_mon_max)
{
       $day_diff = $day_diff - $base_mon_max;
       $mon_diff = $mon_diff + 1;
}

// handle overflow of years
if ($mon_diff >= 12)
{
       $mon_diff = $mon_diff - 12;
       $yr_diff = $yr_diff + 1;
}

// the results are here:

// $yr_diff          --> the years between the two dates
// $mon_diff         --> the month between the two dates
// $day_diff         --> the days between the two dates

// ****************************************************************************

// simple output of the results
print "The difference between <b>".$base_yr."-".$base_mon."-".$base_day."</b> ";
print "and <b>".$current_yr."-".$current_mon."-".$current_day."</b> is:";
print "<br><br>";

// this is just to make it look nicer
$years = "years";
$days = "days";
if ($yr_diff == "1") $years = "year";
if ($day_diff == "1") $days = "day";

// here we go
print $yr_diff." ".$years.", ";
print $mon_diff." month and ";
print $day_diff." ".$days;

?>



выводит разницу между двумя датами.....

Не слишком ли все сложно? иначе ни как нельзя???
Добавлено @ 23:41
вобщем нужна такая функция:

Код

function GetDifTime($time1, $time2, $z) {

if ($z=="min") {
 //выводит разницу по времени в минутах...
} else if ($z=="hours") {
 //выводит разницу по времени в часах...
} ...

getDifTime = res;
}



аналогичную функцию для даты.

Автор: Mal Hack 26.2.2005, 23:48
Код
<?php

$d_1 = "04.08.2004 10:00";
$d_2 = "04.08.2004 11:00";

$da_1 = explode( " " , $d_1 );
$da_2 = explode( " " , $d_2 );

$dd_1 = explode( "." , $da_1[0] );
$dd_2 = explode( "." , $da_2[0] );

$dt_1 = explode( ":" , $da_1[1] );
$dt_2 = explode( ":" , $da_2[1] );

$r1 = mktime( $dt_1[0] , $dt_1[1] , 0 , $dd_1[1] , $dd_1[0] , $dd_1[2] );
$r2 = mktime( $dt_2[0] , $dt_2[1] , 0 , $dd_2[1] , $dd_2[0] , $dd_2[2] );

print "Date1 - Date2 = " . ( $r2 - $r1 ) . " sec";

?>


Все это можно упростить, если ты скажешь в каком формате дату ты имеешь изначально.

Автор: HappyMan 26.2.2005, 23:52
Mal Hack
ого! как быстро!

формат:
0000-00-00 00:00:00

типа: Y-m-d h:m:s
если не ошибяюсь!
Добавлено @ 23:56
у меня есть вариант но немного другой по сущности:

Код


<?

$old="1109451222";
$cur=mktime();

echo "Proshlo: ".$cur-$old."sekund";
echo "Proshlo: ".($cur-$old) div 60."minut";
echo "Proshlo: ".($cur-$old).div 3600."casov";

?>

Автор: Mal Hack 26.2.2005, 23:56
Ну как раз...
Чуть щаблон подправь. И символы по которым explode разюбивает. и 0 замен и на $dt_1[2].

Автор: HappyMan 27.2.2005, 00:01
Mal Hack
Большое спасибо за оперативность! наберу 100 постов плюсик поставлю smile)

Автор: HappyMan 27.2.2005, 00:18
Mal Hack
а чтобы например один час добавить нада так:

$dt_1[0] += 1;

da???

Автор: Mal Hack 27.2.2005, 00:20
Да. Тока зачем тебе это?

Автор: HappyMan 27.2.2005, 00:21
Mal Hack
эт я на будущее

Автор: HappyMan 27.2.2005, 00:53
Выкладываю функцию чтобы вы не мучались как я:

Код

function GetDifDate($d_1, $d_2, $t) {
//for test
//$d_1 = "04.08.2004 10:45:33";
//$d_2 = "04.08.2004 11:00:00";

$da_1 = explode( " " , $d_1 );
$da_2 = explode( " " , $d_2 );

$dd_1 = explode( "." , $da_1[0] );
$dd_2 = explode( "." , $da_2[0] );

$dt_1 = explode( ":" , $da_1[1] );
$dt_2 = explode( ":" , $da_2[1] );

$r1 = mktime( $dt_1[0] , $dt_1[1] , $dt_1[2], $dd_1[1] , $dd_1[0] , $dd_1[2] );
$r2 = mktime( $dt_2[0] , $dt_2[1] , $dt_2[2], $dd_2[1] , $dd_2[0] , $dd_2[2] );

if ($t=="sec")
 return ($r2-$r1);
 else if ($t=="min")
   return round((($r2-$r1) / 60));
   else if ($t=="hours")
     return round((($r2-$r1) / 3600));
}


Example:
echo getDifDate( "04.08.2004 10:45:33", "04.08.2004 12:47:40", "min");

Выражаю большую благодарность за помощь в создании (практически создание) этой функции
Mal Hack smile

Автор: Mal Hack 27.2.2005, 14:26
Цитата(HappyMan @ 27.2.2005, 00:53)
if ($t=="sec")
  return ($r2-$r1);
  else if ($t=="min")
    return round((($r2-$r1) / 60));
    else if ($t=="hours")
      return round((($r2-$r1) / 3600));

Сделай через switch.

Автор: HappyMan 27.2.2005, 17:10
Mal Hack
кстати как в ПХП выглядит аналог div???? (целая часть от деления)

Автор: penizillin 27.2.2005, 17:48
Код
$a = floor($b/$c);

Автор: Mal Hack 27.2.2005, 18:43
или ceil(); или round();.

Автор: penizillin 27.2.2005, 18:51
Mal Hack: как я понимаю, целая часть от деления, это всегда требует floor().

Автор: Mal Hack 27.2.2005, 18:55
Цитата(penizillin @ 27.2.2005, 18:51)
Mal Hack: как я понимаю, целая часть от деления, это всегда требует floor().

Ну да.. Просто я как бы еще показал функции для округления ака целой части... floor(), просто всегда вниз округляет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)