Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с датой: Юникс, Стамп и т.д, помогите написать модуль... 
:(
    Опции темы
HappyMan
Дата 26.2.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



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

Код

<?

// 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 [email protected]
//

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

// 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;
}



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


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
Mal Hack
Дата 26.2.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Код
<?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";

?>


Все это можно упростить, если ты скажешь в каком формате дату ты имеешь изначально.
PM ICQ   Вверх
HappyMan
Дата 26.2.2005, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



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";

?>



--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
Mal Hack
Дата 26.2.2005, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Ну как раз...
Чуть щаблон подправь. И символы по которым explode разюбивает. и 0 замен и на $dt_1[2].
PM ICQ   Вверх
HappyMan
Дата 27.2.2005, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



Mal Hack
Большое спасибо за оперативность! наберу 100 постов плюсик поставлю smile)


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
HappyMan
Дата 27.2.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



Mal Hack
а чтобы например один час добавить нада так:

$dt_1[0] += 1;

da???


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
Mal Hack
Дата 27.2.2005, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Да. Тока зачем тебе это?
PM ICQ   Вверх
HappyMan
Дата 27.2.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



Mal Hack
эт я на будущее


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
HappyMan
Дата 27.2.2005, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



Выкладываю функцию чтобы вы не мучались как я:

Код

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


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
Mal Hack
Дата 27.2.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(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.
PM ICQ   Вверх
HappyMan
Дата 27.2.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: 2
Всего: 2



Mal Hack
кстати как в ПХП выглядит аналог div???? (целая часть от деления)


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
penizillin
Дата 27.2.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 10.11.2004

Репутация: 8
Всего: 9



Код
$a = floor($b/$c);

PM MAIL ICQ   Вверх
Mal Hack
Дата 27.2.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



или ceil(); или round();.

PM ICQ   Вверх
penizillin
Дата 27.2.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 10.11.2004

Репутация: 8
Всего: 9



Mal Hack: как я понимаю, целая часть от деления, это всегда требует floor().
PM MAIL ICQ   Вверх
Mal Hack
Дата 27.2.2005, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



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

Ну да.. Просто я как бы еще показал функции для округления ака целой части... floor(), просто всегда вниз округляет.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.