Перейти к содержимому


Партнерская программа Kredov

PHP-функция для вычисления разницы между датами

#1 FordogeN

FordogeN
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0
0

Отправлено 04 Январь 2010 - 04:10

Гуглил, гуглил и не на гуглил...
Какие в php есть функции для вычисления разницы между датами?
Если быть точней - мне нужно чтоб выдавало наступил этот день или нет.

 

 

  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 04 Январь 2010 - 18:09

FordogeN, моя реализация, но нужно учесть, что дата должга задаваться в определённых форматах

Функция strtotime() использует GNU формат даты, поэтому рекомендуется ознакомиться с руководством GNU Date Input Formats, где описывается синтаксис аргумента time.


<?php

// функция сверки даты с текущей, если соответствует текущей то true, иначе false
function is_today($date)
{
$timestamp = strtotime($date); // получаем метку времени из переданной даты (из строки даты в метку)
$date = getdate($timestamp); // получаем массив информации о переданной дате
$now = getdate(); // получаем массив информации о текущей дате
return $now['mday'] == $date['mday'] && $now['mon'] == $date['mon'] && $now['year'] == $date['year'] ? true : false;
}

// ПРИМЕРЫ

$date1 = "2010-01-04"; // Задаём в виде YYYY-mm-dd HH:ii:ss, я сократил до YYYY-mm-dd

if( is_today($date1) ) echo "new";
else echo "old";

$date2 = "20100104"; // Задаём в формате timestamp YYYYmmddHHiiss, я сократил до YYYYmmdd

if( is_today($date2) ) echo "new";
else echo "old";

?>

  • 0

#3 EugeneM

EugeneM
  • Пользователь
  • 20 сообщений
  • Репутация: 0

Отправлено 04 Январь 2010 - 23:29

А не проще ли сравнивать timestamp у обоих дат?
И сравнений меньше. И плюс, учитывая что чаще дата хранится именно как timestamp, и преобразований меньше.
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 05 Январь 2010 - 00:23

EugeneM, Такого понятия как TIMESTAMP в PHP нет. Переводить строку в число не получится, разрядов не хватило у меня.
Можно сравнивать строки, в этом проблем у PHP нет. Но проблема получается когда мы будем пользоваться сокращенным TIMESTAMP, там сравнение строк различно, что 20101004, что 20100104000000
Если уж придерживаться стандартов TIMESTAMP, то дату записываем в виде YYYYmmddHHiiss, тогда сравнение будет проводиться верно. Реализация номер 2:
<?php

// функция сверки даты с текущей, если соответствует текущей то true, иначе false
function is_today($date)
{
$start_date = date("YmdHis", mktime(0,0,0)); // текущая дата - время 00:00:00 (начало дня)
$end_date = date("YmdHis", mktime(23,59,59)); // текущая дата - время 23:59:59 (конец дня)
return $start_date <= $date && $date <= $end_date ? true : false;
}

// ПРИМЕРЫ

$date1 = date("YmdHis", mktime(12, 13, 50, 1, 4, 2010)); // формируем дату 20100401121350 с помощью date

if( is_today($date1) ) echo "current";
else echo "no current";

$date2 = "20100401121350"; // формируем дату 20100401121350 в виде строки

if( is_today($date2) ) echo "current";
else echo "no current";

?>

  • 0

#5 FordogeN

FordogeN
    Topic Starter
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0

Отправлено 05 Январь 2010 - 14:39

ZiTosS, спасибо, но немного не то.
Задача у меня следующая: нужно вывести все записи у которых дата меньше или равна текущей... т.е. если этот день уже наступил - запись отображается, если еще не наступил - она не отображается.
  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Январь 2010 - 00:34

FordogeN, Тогда второй вариант катит очень хорошо. Если тчо приводи дату к такому формату и сравнивай строки.
  • 0

#7 FordogeN

FordogeN
    Topic Starter
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0

Отправлено 07 Январь 2010 - 14:24

Вот уже час парюсь - он выдает "new" только если дата совпадает, а если это будущая или прошедшая дата - говорит "old".
Мне нужно чтоб говорил "new" если дата больше текущей.


  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Январь 2010 - 19:40

Я же сказал взять второй вариант, проверь сооветствие строк формату, чтобы все нули и числа были на местах
<?php

// функция сверки даты с текущей, если соответствует текущей то true, иначе false
function isNewDate($date)
{
$start_date = date("YmdHis", mktime(0,0,0)); // текущая дата - время 00:00:00 (начало дня)
return $start_date <= $date ? true : false;
}

// ПРИМЕРЫ

$date1 = date("YmdHis", mktime(12, 13, 50, 1, 4, 2010)); // формируем дату 20100401121350 с помощью date

if( isNewDate($date1) ) echo "new";
else echo "old";

$date2 = "20100401121350"; // формируем дату 20100401121350 в виде строки

if( isNewDate($date2) ) echo "new";
else echo "old";

?>


Если на первом примере
function isNewDate_first($date)
{
$timestamp = strtotime($date); // получаем метку времени из переданной даты (из строки даты в метку)
$date = getdate($timestamp); // получаем массив информации о переданной дате
$now = getdate(); // получаем массив информации о текущей дате

if( $date['year'] >= $now['year'] )
if( $date['mon'] >= $now['mon'] )
if( $date['mday'] >= $now['mday'] ) return true;

return false
}


Код
	if( $date['year'] >= $now['year'] )
if( $date['mon'] >= $now['mon'] )
if( $date['mday'] >= $now['mday'] ) return true;

Можно заменить на одно условие(что тоже самое)
	if( $date['year'] >= $now['year'] && $date['mon'] >= $now['mon'] && $date['mday'] >= $now['mday'] )
return true;

  • 0

#9 FordogeN

FordogeN
    Topic Starter
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0

Отправлено 07 Январь 2010 - 19:51

Я понял что ты про второй пример.
Я проверял соответствие формату 4 раза и всегда один результат...

Вот так я использовал это.

$str = $array['date'];
$str_exp = explode("/", $str);
$date1 = $str_exp['2']."-".$str_exp['1']."-".$str_exp['0']; // Задаём в виде YYYY-mm-dd

if( is_today($date1) ) echo $array['id']." - Запись с этим ID не должна выводиться<br><br>";
else printf ("%s - <a href='show-%s.htm'>%s</a><br>%s<br><br>" ,$array['date'],$array['id'],$array['name'],$array['prev']);


  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Январь 2010 - 20:19

Покажи функцию с которой ты работал, дата у тебя для второго примера явно не правильно задаётся.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru