::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Разработка CRM для туристического бизнес...
  - тестування по прив"язці до часу...
  - СРОЧНО! Требуется талантливый PHP програ...
  - Оплачу FLASH-сайт под ключ.
  - выборка одним запросом нескольких похожи...
  - функции верификации строк.
  - Помогите вытянуть скрипт отправки почты ...


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Шпаргалки

Шпаргалки

Автор: - Yurik
Дата публикации - 10.05.2005
Просмотров: - 9078

Работа с датой/временем или мифы о том что в году 365 дней* а в дне 24 часа**


* В году может быть 365 и 366 дней.
** Дни бывают по 23, 24 и 25 часов

[p]1 Посчитать возраст человека, дата рождения которого хранится в поле DATE[/p]

[php]
SELECT name, IF ((MONTH(NOW())>MONTH(birthday)),(YEAR(NOW())-YEAR(birthday)),
IF ((MONTH(NOW())>IF ((DAYOFMONTH(NOW())>=DAYOFMONTH(birthday)),(YEAR(NOW())-YEAR(birthday)),
IF ((MONTH(NOW())>(YEAR(NOW())-YEAR(birthday)-1))) as years_old FROM person
[

/php]

Решение на первый раз закрученное но правильно можно посчитать только так,
ибо количество дней в году непостоянно

[p]2 Посчитать разницу в днях между двумя датами[/p]

Решение 2.1. Средствами БД (не работает с таймстемпами до 1970 года)

[php]
SELECT TO_DAYS(t2)-TO_DAYS(t1)
SELECT DATEDIFF(t1,t2)
[

/php]

Решение 2.2. Средствами PHP (работает даже с датами до Рождества Христового)
[php]
function date2Days($_timestamp) {
  $_year=(int) date('Y',$_timestamp);
  $_month=(int) date('m',$_timestamp);
  $_day=(int) date('j',$_timestamp);
  $_century = substr($_year,0,2);
  $_year = substr($_year,2,2);
  if($_month>2) $_month -= 3;
  else {
        $_month += 9;
        if($_year) $_year--;
        else {
         $_year=99;
         $_century --;
        }
  }
  return (floor((146097*$_century)/4)+floor((1461*$_year)/4)+floor((153*$_month+2)/5)+$_day+1721119);
 }

 $daysDiff=date2Days($t2)-date2Days($t1);[

/php]

[p]3. Добавить к дате N дней[/p]
[php]
 function adddays($_timestamp, $_days){
        $_sdatey=date('Y', $_timestamp);
        $_sdatem=date('m', $_timestamp);
        $_sdated=date('d', $_timestamp);
        $_sdated+=$_days;
        $_timestamp=mktime(0,0,0,$_sdatem,$_sdated,$_sdatey);
        return $_timestamp;
 }[

/php]

[p]4. Сгенерить в цикле дни[/p]

Решение 1. Неправильное
[php]
for ($t=$t1; $t<=$t2; $t=$t+24*60*60) { echo $t};[

/php]

Решение 2. Правильное
[php]
$y=date('Y', $t1);
   $m=date('m', $t1);
   $d=date('d', $t1);
for ($i=1; $i<$N; $i++){
 $t=mktime(0,0,0,$m, $d+$i, $y);
}[

/php]

Приятное дополнение от [url=/forum/profile.php?mode=viewprofile&u=1193]Zerkms[/url] - Функция для вычисления разницы между двумя датами с учётом високосных годов и разного числа дней в месяцах.

[php]
<?php

/**
* Calculate difference between two timestamps
* @param string $date_start start date in unix timestamp
* @param string $date_finish finish date in unix timestamp
* @return array the result array in the follow format: 0 => seconds, 1 =>
minutes, 2 => hours, 3 => days, 4 => months, 5 => years
* @author zerkms (Ivan Kurnosov)
*/

function calc_period($date_start$date_finish) {
                
$st explode('-'date('d-m-Y-H-i-s'$date_start));
                
$fin explode('-'date('d-m-Y-H-i-s'$date_finish));

                if ((
$seconds $fin[5] - $st[5]) < 0) {
                        
$fin[4]--;
                        
$seconds += 60;
                }

                if ((
$minutes $fin[4] - $st[4]) < 0) {
                        
$fin[3]--;
                        
$minutes += 60;
                }

                if ((
$hours $fin[3] - $st[3]) < 0) {
                        
$fin[0]--;
                        
$hours += 24;
                }

                if ((
$days $fin[0] - $st[0]) < 0) {
                        
$fin[1]--;
                        
$days date('t'mktime(100$st[1], $st[0], $st[2])) - $st[0] + $fin[0];
                }

                if ((
$months $fin[1] - $st[1]) < 0) {
                        
$fin[2]--;
                        
$months += 12;
                }

                
$years $fin[2] - $st[2];
                
                return array(
$seconds$minutes$hours$days$months$years);
}


// Примеры использования

$date_finish strtotime("1-03-2008");
$date_start strtotime("31-01-2008");

$result calc_period($date_start$date_finish);

echo 
'C ' date('h:i:s d-m-y'$date_start) . ' по 'date('h:i:s d-m-y'$date_finish) .' прошло ' $result[0] . ' секунд ' $result[1]. ' минут ' .$result[2] . ' часов ' .$result[3] . ' дней ' $result[4] . ' месяцев ' $result[5] . ' лет <br>';

?>[

/php]



Обсудить в ФОРУМе - комментариев ()


Путь: Шпаргалки

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005