[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сегодня 1-11-31, завтра 2-0-0
sergeiss
Это я к тому, что завтра будет 2 года, как я припёрся на этот форум. Поначалу задал несколько глупейших вопросов, типа "как получить список файлов из каталога", "как вывести изображение на странице" (как его сделать, сам разобрался smile.gif). Потом ввязался в одну дискуссию, связанную с ООП... Где-то что-то спрашивал, где-то что-то отвечал... И пошло-поехало.
И пока мне непонятно: будет показано 2-0-0 или 2-0-1 (лет-месяцев-дней).



Спустя 3 минуты, 59 секунд (5.02.2010 - 16:33) Gabriel написал(а):
sergeiss
ну вот давай подождем до завтра и узнаем smile.gif

Спустя 11 секунд (5.02.2010 - 16:34) DedMorozzz написал(а):
201 (;
Прошло 2 года...а вопросы всё теже. Только уже отвечать ты, а не задаёшь smile.gif Аля смена поколений

Спустя 32 минуты, 9 секунд (5.02.2010 - 17:06) waldicom написал(а):
Ставим ставки! Думаю, будет написано 2 года, 1 день

Спустя 9 минут, 3 секунды (5.02.2010 - 17:15) stepan написал(а):
sergeiss мои поздравления, можно так сказать это твой день рождения на этом форуме. wink.gif

Спустя 1 час, 9 минут, 19 секунд (5.02.2010 - 18:24) FatCat написал(а):
Дата регистрации в формате юниксштамп (10 цифр) берется из БД в переменную $member['joined'], вот дальнейший код:

Свернутый текст
// +FatCat Заменяю дату регистрации стажем на форуме
$summ_trezz = time() - $member['joined'];
$summary_days = ceil($summ_trezz/86400)-1; //дни
$summary_yaers = ceil($summary_days/365)-1; //годы

$years = "лет";
if ($summary_yaers%10 == "1" and $summary_yaers!="11") $years = "год";
if ($summary_yaers%10 == "2" and $summary_yaers!="12") $years = "года";
if ($summary_yaers%10 == "3" and $summary_yaers!="13") $years = "года";
if ($summary_yaers%10 == "4" and $summary_yaers!="14") $years = "года";

$summ_count_str .= $summary_yaers." ".$years.", ";

$summary_days2 = $summary_days - ($summary_yaers*365); // дней меньше года
$summary_months = "11 месяцев, ";
$summary_days3 = $summary_days2 - 334;
if($summary_days2 < 335){$summary_months = "10 месяцев, "; $summary_days3 = $summary_days2 - 304;}
if($summary_days2 < 305){$summary_months = "9 месяцев, "; $summary_days3 = $summary_days2 - 273;}
if($summary_days2 < 274){$summary_months = "8 месяцев, "; $summary_days3 = $summary_days2 - 243;}
if($summary_days2 < 244){$summary_months = "7 месяцев, "; $summary_days3 = $summary_days2 - 212;}
if($summary_days2 < 213){$summary_months = "6 месяцев, "; $summary_days3 = $summary_days2 - 181;}
if($summary_days2 < 182){$summary_months = "5 месяцев, "; $summary_days3 = $summary_days2 - 151;}
if($summary_days2 < 152){$summary_months = "4 месяца, "; $summary_days3 = $summary_days2 - 120;}
if($summary_days2 < 121){$summary_months = "3 месяца, "; $summary_days3 = $summary_days2 - 90;}
if($summary_days2 < 91){$summary_months = "2 месяца, "; $summary_days3 = $summary_days2 - 59;}
if($summary_days2 < 60){$summary_months = "1 месяц, "; $summary_days3 = $summary_days2 - 31;}
if($summary_days2 < 32){$summary_months = ""; $summary_days3 = $summary_days2;}

$summ_count_str .= "<nobr>".$summary_months."</nobr>";

$days = "дней";
if ($summary_days3 == "1" or $summary_days3 == "21" or $summary_days3 == "31") $days = "день";
if ($summary_days3 == "2" or $summary_days3 == "3" or $summary_days3 == "4"
or $summary_days3 == "22" or $summary_days3 == "23" or $summary_days3 == "24") $days = "дня";

$summ_count_str .= "<nobr>".$summary_days3." ".$days."</nobr>";

$summ_count_str = str_replace("0 лет, ","",$summ_count_str);
$summ_count_str = str_replace(", 0 дней","",$summ_count_str);
if($summary_days == 0)$summ_count_str = "первый день";
$member['member_joined'] = "На форуме: ".$summ_count_str;
// - FatCat


Писал давно, поэтому прошу не смеяться над наивными приемами программирования.

Спустя 2 минуты, 31 секунда (5.02.2010 - 18:27) DedMorozzz написал(а):
Чёрт, а веть была такая интрига...

Спустя 15 часов, 48 минут (6.02.2010 - 10:15) sergeiss написал(а):
Странно... Вчера было 1-11-31, сегодня 1-11-31...

Спустя 1 час, 25 минут, 58 секунд (6.02.2010 - 11:41) DedMorozzz написал(а):
2,1 smile.gif Ну феткет всю интригу под корень...как и следовало ожидать 2 года, 1 день (:
Ну что Сергейсс, с юбилеем тебя! wink.gif

Спустя 28 минут, 52 секунды (6.02.2010 - 12:09) Joker написал(а):
Цитата (DedMorozzz @ 6.02.2010 - 13:41)
Ну что Сергейсс, с юбилеем тебя!

юбелей был день назад))))) когда было 200 biggrin.gif biggrin.gif biggrin.gif


Поздравляю!

Спустя 20 минут, 46 секунд (6.02.2010 - 12:30) DedMorozzz написал(а):
не было 200. было 1-12-31

Спустя 9 часов, 31 минута, 9 секунд (6.02.2010 - 22:01) sergeiss написал(а):
DedMorozzz - 1-12-31? Не видел такого. Сначала было с утра 1-11-31, а потом сразу 2-1 (без месяцев).
Но в любом случае 3-й год пошел smile.gif

Спустя 8 минут, 58 секунд (6.02.2010 - 22:10) FatCat написал(а):
Цитата (DedMorozzz @ 6.02.2010 - 13:30)
не было 200.

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


Цитата (sergeiss @ 6.02.2010 - 11:15)
Вчера было 1-11-31, сегодня 1-11-31...

Смена даты не в полночь, а в час когда зарегистрировался.
Скрипт же работает с числом секунд от секунды регистрации до текущей.
Зато никакой привязки к часовым поясам. biggrin.gif

Спустя 14 минут, 17 секунд (6.02.2010 - 22:25) sergeiss написал(а):
Цитата (FatCat @ 6.02.2010 - 23:10)
Скрипт же работает с числом секунд от секунды регистрации до текущей.

"Так вот оно чё, Михалыч!" smile.gif

Цитата (FatCat @ 6.02.2010 - 23:10)
а вот число дней перевести в годы и месяцы - не знаю функции.

Объекты DateTime и DateInterval. Не далее как вчера решал такую же задачу smile.gif Надо удалить файлы в каталоге, которые старше указанного количества дней. При этом дата создания заложена в имени файла. Типа такого: Log_2009_10_23.txt
И следующий код очень удачно находит (и удаляет) искомые файлы, не трогая все, имена которых не соответствуют шаблону.
И нету привязки к конкретным месяцам.

	$currdate=new DateTime();
$filedate=new DateTime();
$currdate->setDate( date('Y'), date('m'), date('d'));
$dir=dir( 'c:/rms_stat/log' );
$path=$dir->path;

$files_deleted=0;
while( $file=$dir->read() )
{
list( $f_name, $f_ext)=explode( '.', $file );
if( trim( $f_ext ) != 'txt' ) continue;
list( $name, $year, $month, $day )=explode( '_', $f_name );
if( intval( $year ) == 0 or intval( $month ) == 0 or intval( $day ) == 0 ) continue;

$filedate->setDate( $year, $month, $day);
list( $y, $m, $d)=explode( ' ', $filedate->diff( $currdate )->format( '%y %m %d' ) );

// разницу я нахожу в днях, потому что мне так удобнее в данном случае
$diff=$y*12*30+$m*30+$d;

if( $diff > 10 ) // удалить log-файл
{
$for_unlink=$path.'/'.$file;
unlink( $for_unlink );
$files_deleted++;
}

}


Спустя 22 минуты, 59 секунд (6.02.2010 - 22:48) FatCat написал(а):
sergeiss
366 дней это ровно год или год и день?
Если попало в промежуток 29 февраля високосного года - тогда ровно год; не попало - год и день.

Спустя 13 часов, 28 минут, 13 секунд (7.02.2010 - 12:16) FatCat написал(а):
Выспался, сообразил.
У нас же всегда есть два юниксштампа, две цифры; например момент регистрации и текущий момент.
Дальше по date('Y') получаем 2 цифры года и считаем; то же для месяцев, дней, часов и минут. smile.gif

Спустя 4 часа, 6 минут, 15 секунд (7.02.2010 - 16:22) FatCat написал(а):
Сделал, установил.
Не очень простой код получился...
	/*-------------------------------------------------------------------------*/
// Интервал времени между событиями
/*-------------------------------------------------------------------------*/

function date_diff($begin, $end=0){
if(!$end)$end = time();

if( intval($end)<=intval($begin) )return array();

$s_diff = intval(date("s",$end)) - intval(date("s",$begin));
if($s_diff<0)
{
$s_diff += 60;
$end -= 60;
}
$i_diff = intval(date("i",$end)) - intval(date("i",$begin));

if($i_diff<0)
{
$i_diff += 60;
$end -= 3600;
}
$g_diff = intval(date("G",$end)) - intval(date("G",$begin));
if($g_diff<0)
{
$g_diff += 24;
$end -= 86400;
}

$y_diff = intval(date("Y",$end)) - intval(date("Y",$begin));
$m_diff = intval(date("m",$end)) - intval(date("m",$begin));
$dpm = 30;
if( stristr(",1,3,5,7,8,10,12,",",".date("Y",$end).",") )$dpm = 31;
if(date("m",$end) == "2")
{
if( intval(date("Y",$end))%4 )$dpm = 28;
else $dpm = 29;
}
$d_diff = intval(date("d",$end)) - intval(date("d",$begin));
if($d_diff<0)
{
$d_diff += $dpm;
$m_diff--;
}
if($m_diff<0)
{
$m_diff += 12;
$y_diff--;
}

$diff = array();

$str = " лет";
if($y_diff%10 == 1 and $y_diff!=11)$str = " год";
if( $y_diff%10>1 and $y_diff%10<5 and ( $y_diff<10 or $y_diff>20 ) )$str = " года";
if($y_diff)$diff['y'] = $y_diff.$str;

$str = " месяцев";
if($m_diff == 1)$str = " месяц";
if($m_diff>1 and $m_diff<5)$str = " месяца";
if($m_diff)$diff['m'] = $m_diff.$str;

$str = " дней";
if($d_diff%10 == "1" and $d_diff!=11)$str = " день";
if( $d_diff%10>1 and $d_diff%10<5 and ( $d_diff<10 or $d_diff>20 ) )$str = " дня";
if($d_diff)$diff['d'] = $d_diff.$str;

$str = " часов";
if($g_diff%10 == "1" and $g_diff!=11)$str = " час";
if( $g_diff%10>1 and $g_diff%10<5 and ( $g_diff<10 or $g_diff>20 ) )$str = " часа";
if($g_diff)$diff['g'] = $g_diff.$str;

$str = " минут";
if($i_diff%10 == "1" and $i_diff!=11)$str = " минута";
if( $i_diff%10>1 and $i_diff%10<5 and ( $i_diff<10 or $i_diff>20 ) )$str = " минуты";
if($i_diff)$diff['i'] = $i_diff.$str;

$str = " секунд";
if($s_diff%10 == "1" and $s_diff!=11)$str = " секунда";
if( $s_diff%10>1 and $s_diff%10<5 and ( $s_diff<10 or $s_diff>20 ) )$str = " секунды";
if($s_diff)$diff['s'] = $s_diff.$str;

return $diff;
}


А для вывода под аватарки:
		$diff = $std->date_diff($member['joined']);

if(!$diff['y'] and !$diff['m'] and !$diff['d'])unset($diff['s']);
else unset($diff['g'],$diff['i'],$diff['s']);

$diff = "<nobr>".implode(",</nobr> <nobr>",$diff)."</nobr>";

$member['member_joined'] = "На форуме: ".$diff;


В результате первые сутки будет считать часы и минуты, затем с точностью до дня; переход дня по моменту времени регистрации.

Спустя 5 часов, 37 минут, 30 секунд (7.02.2010 - 21:59) sergeiss написал(а):

  $s_diff = intval(date("s",$end)) - intval(date("s",$begin));
  if($s_diff<0)
  {
  $s_diff += 60;
  $end -= 60;
  }
  $i_diff = intval(date("i",$end)) - intval(date("i",$begin));
 
  if($i_diff<0)
  {
  $i_diff += 60;
  $end -= 3600;
  }
  $g_diff = intval(date("G",$end)) - intval(date("G",$begin));
  if($g_diff<0)
  {
  $g_diff += 24;
  $end -= 86400;
  }
 
  $y_diff = intval(date("Y",$end)) - intval(date("Y",$begin));
  $m_diff = intval(date("m",$end)) - intval(date("m",$begin));
  $dpm = 30;
  if( stristr(",1,3,5,7,8,10,12,",",".date("Y",$end).",") )$dpm = 31;
  if(date("m",$end) == "2")
  {
  if( intval(date("Y",$end))%4  )$dpm = 28;
  else $dpm = 29;
  }
  $d_diff = intval(date("d",$end)) - intval(date("d",$begin));
  if($d_diff<0)
  {
  $d_diff += $dpm;
  $m_diff--;
  }
  if($m_diff<0)
  {
  $m_diff += 12;
  $y_diff--;
  }

Всю процитированную выше часть кода можно заменить на нечто более простое (основа - мой код на предыдущей странице темы):

	$olddate=new DateTime();
$currdate=new DateTime();

$olddate->setDate( date('Y', $begin), date('m', $begin), date('d', $begin));
$currdate->setDate( date('Y', $end), date('m', $end), date('d', $end));

list( $y, $m, $d)=explode( ' ', $olddate->diff( $currdate )->format( '%y %m %d' ) );

// вуаля - в переменных $y, $m, $d записана разница между датами smile.gif с учетом високосности годов.


Проверь - должно работать исправно.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.