Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP класс для работы с датой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (4): [1] 2 3 4 »   

> Без описания
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 01:28:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Всем привет!
Написал класс для работы с датой.
Если надо получить разницу в днях, или в минутах (в промежутке 24 часов), или получить дату окончания, на пример, услуги в каком-нибудь приложении.
Вот, может кому пригодится)
Просто часто встречаю на форуме вопросы на эту тему.

________________________________ ________________________________ __

Метод end_date([ Дата [ Количество месяцев ]])
Возвращает дату окончания, на пример, услуги.
Без параметров возвращает дату, которая наступит ровно через месяц от текущей даты.

Принимает следующие форматы даты:
хххх.хх.хх
хххх/xx/xx
xx.xx.xxxx
xx/xx/xxxx

с любыми не числовыми разделителями (хоть запятые через пробел: хх , хх , хххх),
а так же без ведущих нулей, если хотите (х.х.хххх)

и возвращает дату в формате:
хххх-хх-хх

Примеры:

PHP:
скопировать код в буфер обмена
  1.  
  2. $diff = new Diff_date_class();
  3.  
  4. // Один месяц от текущей даты
  5. $diff->date_result();
  6.  
  7. // Один месяц от указанной даты
  8. $diff->date_result('24.01.2012');
  9.  
  10. // 16 месяцев от текущей даты
  11. $diff->date_result('', 16);
  12.  
  13. // 5 месяцев от указанной даты
  14. $diff->date_result('24.01.2012', 5);
  15.  
  16. // Для преобразования в нужный формат
  17. $diff->date('d-m-Y', strtotime(date_result('24.01.2012')));
  18.  
  19.  

________________________________ ________________________________ __

Метод diff_days(Начальная дата, [Конечная дата [ boolean ]])
возвращает разницу в днях.
Конечная дата по умолчанию текущая.
Если третий параметр == true,
то разница, если она отрицательная, выведится без знака минус.
По умолчанию false

PHP:
скопировать код в буфер обмена
  1.  
  2. $diff = new Diff_date_class();
  3.  
  4. echo $diff->diff_days('21-02-2012');
  5. echo '<br>';
  6. echo $diff->diff_days('21-12-2011', '', true);
  7. echo '<br>';
  8. echo $diff->diff_days('21-02-2012', '21-05-2012');
  9. echo '<br>';
  10. echo $diff->diff_days('21-02-2012', '21-05-2012', true);
  11. echo '<br>';
  12. echo $diff->diff_days('21-05-2012', '21-02-2012');
  13.  

________________________________ ________________________________ __

Метод diff_time(Начальное время, [ Конечное время [ boolean ]])
возвращает разницу во времени в минутах.
Конечное время по умолчанию текущее.
Если третий параметр == true,
то разница, если она отрицательная, выведится без знака минус.
По умолчанию false

PHP:
скопировать код в буфер обмена
  1.  
  2. $diff = new Diff_date_class();
  3.  
  4. echo $diff->diff_time(date('H'), '', true);
  5. echo '<br>';
  6. echo $diff->diff_time('04:35');
  7. echo '<br>';
  8. echo $diff->diff_time('04:35', '03:32');
  9. echo '<br>';
  10. echo $diff->diff_time('03:35', '04:35');
  11.  

________________________________ ________________________________ __

Сам класс Diff_date_class() :
________________________________ ________________________________ __

PHP:
скопировать код в буфер обмена
  1.  
  2. class Diff_date_class {
  3.        
  4.         public function end_date($dat = '', $count_mont = null)
  5.         {
  6.           if(empty($dat))
  7.           {
  8.                  $dat = date('Y-m-d');  
  9.           }
  10.           else
  11.           {
  12.                  $dat = preg_replace("/([^0-9]+)/i", "-", $dat);
  13.           }
  14.          
  15.           $m = date('n', strtotime($dat));
  16.           $d = date('j', strtotime($dat));
  17.           $y = date('Y', strtotime($dat));
  18.          
  19.           if($count_mont === null)
  20.           {
  21.                  $count_mont = 1;
  22.           }
  23.                  
  24.            for($i = 1, $j = $m, $y2 = $y; $i <= $count_mont; $i++, $j++)
  25.            {
  26.        
  27.                    if($j > 12)
  28.                    {
  29.                          $j = 1;
  30.                          $y2++;
  31.                    }
  32.        
  33.                   $count_dey += date('t', mktime(0,0,0, $j, $d, $y2));
  34.                  
  35.            }
  36.            
  37.            return date('Y-m-d', mktime(0,0,0, $m, $d, $y) + $count_dey * 24 * 60 * 60);
  38.        
  39.         }
  40.        
  41.  
  42.         public function diff_days($date1 = null, $date2 = null, $tr = false)
  43.         {
  44.           if(empty($date1))
  45.           {
  46.                  die('<h2 style="color:#F00;">Укажите первый параметр метода:<br>
  47.                      <span style="color:#000;">diff_days("дата")</span></h2>');
  48.           }
  49.          
  50.                 if($date2 === true)
  51.                 {
  52.                    die ('<h2 style="color:#F00;">Указан не верный формат даты<br>во втором параметре метода
  53.                         <span style="color:#000;">diff_days()</span> !</h2>');
  54.                 }
  55.                
  56.           $dat = preg_replace("/([^0-9]+)/i", "-", $date1);
  57.  
  58.           $m = date('n', strtotime($dat));
  59.           $d = date('j', strtotime($dat));
  60.           $y = date('Y', strtotime($dat));
  61.          
  62.           $date1 = mktime(0, 0, 0, $m, $d, $y);
  63.          
  64.           if(empty($date2))
  65.           {
  66.                  $date2 = mktime(0, 0, 0, date('n, j, Y'));
  67.           }
  68.           else
  69.           {
  70.                  $dat2 = preg_replace("/([^0-9]+)/i", "-", $date2);
  71.        
  72.                  $m2 = date('n', strtotime($dat2));
  73.                  $d2 = date('j', strtotime($dat2));
  74.                  $y2 = date('Y', strtotime($dat2));
  75.                
  76.                  $date2 = mktime(0, 0, 0, $m2, $d2, $y2);
  77.           }
  78.  
  79.          
  80.           $a = $date1; // Вычисляемая дата
  81.           $b = $date2; // Текущая дата
  82.           $c = 24*60*60; // Количество секунд в сутках
  83.           $abc = ($a-$b)/$c; // Результат разницы в днях
  84.          
  85.           if($tr === true && $abc < 0)
  86.           {
  87.                 $abc = $abc * (-1);
  88.           }
  89.          
  90.           return $abc; 
  91.         }
  92.  
  93.        
  94.         public function diff_time($tim1 = '', $tim2 = null, $tr = false)
  95.         {  
  96.             if(empty($tim1))
  97.                 {
  98.                    $tim1 = date('H:i:s');      
  99.                 }
  100.                
  101.             if(empty($tim2))
  102.                 {
  103.                    $tim2 = date('H:i:s');      
  104.                 }      
  105.                
  106.                 if($tim2 === true)
  107.                 {
  108.                    die ('<h2 style="color:#F00;">Указан не верный формат времени<br>во втором параметре метода
  109.                         <span style="color:#000;">diff_time()</span> !</h2>');
  110.                 }
  111.                
  112.                 $tim1 = preg_replace("/([^0-9]+)/i", ":", $tim1);      
  113.         $tim2 = preg_replace("/([^0-9]+)/i", ":", $tim2);
  114.  
  115.         $time_arr1 = explode(':', $tim1);
  116.                 $time_arr2 = explode(':', $tim2);
  117.                  
  118.                 if(iconv_strlen($time_arr1[0]) > 2 || iconv_strlen($time_arr1[1]) > 2 || iconv_strlen($time_arr1[2]) > 2 || empty($time_arr1[0]))
  119.                 {
  120.                    die ('<h2 style="color:#F00;">Указан не верный формат времени<br>в первом параметре метода
  121.                         <span style="color:#000;">diff_time()</span> !</h2>'); 
  122.                 }
  123.                
  124.                 if(iconv_strlen($time_arr2[0]) > 2 || iconv_strlen($time_arr2[1]) > 2 || iconv_strlen($time_arr2[2]) > 2 || empty($time_arr2[0]))
  125.                 {
  126.                    die ('<h2 style="color:#F00;">Указан не верный формат времени<br>во втором параметре метода
  127.                         <span style="color:#000;">diff_time()</span> !</h2>'); 
  128.                 }
  129.                  
  130.                 if(count($time_arr1) == 1){
  131.                   $tim1 = $tim1.':00:00';
  132.                 }
  133.                
  134.                 if(count($time_arr2) == 1){
  135.                   $tim2 = $tim2.':00:00';
  136.                 }
  137.                
  138.                 $h = date('H', strtotime($tim1));
  139.                 $i = date('i', strtotime($tim1));
  140.  
  141.                 $h2 = date('H', strtotime($tim2));
  142.                 $i2 = date('i', strtotime($tim2));
  143.                        
  144.                 $time = (mktime($h, $i, date('s, n, j, Y')) - mktime($h2, $i2, date('s, n, j, Y'))) / 60;
  145.                  
  146.                 if($tr === true && $time < 0)
  147.                 {
  148.                    $time = $time * (-1);       
  149.                 }
  150.                
  151.                 return $time;
  152.         }
  153.        
  154. }
  155.  
  156.  

(Отредактировано автором: 11 Февраля, 2012 - 02:04:21)

 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:04:29
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


armancho7777777, ИМХО : ООП подхода тут нет и классом это назвать сложно.
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:07:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




sKaa пишет:
armancho7777777, ИМХО : ООП подхода тут нет и классом это назвать сложно.

Просто хотел объеденить всё в одном, а не плодить отдельные 3 функции.
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:17:18
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


разницу в днях можно подсчитать проще.

PHP:
скопировать код в буфер обмена
  1. $date1 = mktime($hour,$minute,$second, $month,$day,$year);
  2. $date2 = mktime($hour,$minute,$second, $month,$day,$year);
  3. $date3 = ($date1 - $date2 > 0) $date1-$date2 : $date2-$date1;
  4. $difference = ceil($date3 / 60 * 60 * 24);

(Отредактировано автором: 11 Февраля, 2012 - 02:21:14)

 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:22:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




А теперь "достаньте" из БД дату в таком формате xxxx-xx-xx,
и сделайте тоже самое.
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:23:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


armancho7777777 пишет:
А теперь "достаньте" из БД дату в таком формате xxxx-xx-xx,
и сделайте тоже самое.

Я в бд timestamp храню ))) Зачем мне там дата целиком??)))



CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT UNIX_TIMESTAMP();
  3.  

(Отредактировано автором: 11 Февраля, 2012 - 02:26:29)

 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:26:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




sKaa пишет:
timestamp храню

Ну и? Как сделаете?
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:28:25
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


armancho7777777 пишет:
Ну и? Как сделаете?
лол )) Ещё проще ))) забей короче, ты не в курсе походу че такое timestamp )))
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:29:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




sKaa пишет:
Зачем мне там дата целиком??

Тем более, к дате ещё и время впридачу)
(Добавление)
sKaa пишет:
забей короче

И не собираюсь.
Заканчивай, раз начал.
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:36:51
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


armancho7777777 ладно для особо одаренных timestamp это кол-во секунд которое прошло с эпохи юникс. Записывается оно ввиде числа 1328920322. Вот из этого числа легко и удобно можно получить в любое время дату, время в минутах, секундах и вывести всё это как угодно, а если все даты хранятся в таком виде то и работать проще с ними в таком виде. Допустим дата если достать из бд дату в таком виде : 1328920322 и прибавить в ней 30 дней будет выглядеть как 1328920322 + 60 * 60 * 24 * 30.
И запрос в базу выглядит :
WHERE blabla<1328920322
WHERE blabla>1328920322
а все функции пхп для работы с датами и заточены под этот самый таймстамп.
echo date('Y.m.d h:i:s', 1328920322 );
mktime(...) // return timestamp
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:40:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




sKaa пишет:
Допустим дата если достать из бд дату в таком виде : 1328920322

С чего это она будет в таком виде?
На сколько я знаю, она в таком:
хххх-хх-хх хх:хх:хх
(Добавление)
sKaa пишет:
timestamp это кол-во секунд которое прошло с эпохи юникс

Считаешь, что сообщил мне новость дня ?)))
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:43:48
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


armancho7777777 пишет:
С чего это она будет в таком виде?

А с чего она будет в другом если я её храню в таком виде?
Для справки mysql тоже заточен под timestamp. Это вопрос типа данных ячейки.
к примеру выполни вот это : "SELECT UNIX_TIMESTAMP();"
http://www[dot]mysql[dot]ru/docs/man/Dat[dot][dot][dot]e_functions[dot]html
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 02:45:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Ясно.
Ну и ладно))
 
 Top
sKaa
Отправлено: 11 Февраля, 2012 - 02:45:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 1997'
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Февраля, 2012 - 03:19:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Ну и что?
Попробовал записать такое значение 1328920322 в поле типа timestamp, там все равно в таком виде записалось хххх-хх-хх хх:хх:хх
 
 Top
Страниц (4): [1] 2 3 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB