|
 |
Путь: Шпаргалки
Шпаргалки
Автор: - 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(1, 0, 0, $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.
|
|