Работа с датами в PHP. Часть 2
Размещено 14 декабря 2009 | Просмотров: 18 199
в рубрике PHP | 11 комментариев
В одном из предыдущих постов я начал рассматривать вопросы, касающиеся работы с датой в PHP. Напомню, что было рассмотрено, как сформировать текущую дату и дату «по-русски». Сегодня разберем вопрос сравнения дат.
PHP. Сравнение даты.
Очень часто возникает задача сравнить 2 даты, например такие:
1 2 3 4 | <?php $date1 = "01-02-2010 12:00"; $date2 = "31-12-2009 11:59"; ?> |
И задача часто ставится не просто сравнить 2 даты, но и вычислить, насколько одна больше другой. Воспользуемся для этого функцией mktime(). Эта функция позволяет перевести дату в таймстамп (timestamp), т.е. в количество секунд, прошедших с 00:00:00 01:01:1970. Формат у функции такой:
1 | int mktime (int hour, int minute, int second, int month, int day, int year [, int is_dst]) |
Для того, чтобы из нашей даты получить дни, месяцы и годы — необходимо извлечь их как из обычной строки. Т.е. для наших дат сравнение будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php $date1 = "01-02-2010 12:00"; $date2 = "31-12-2009 11:59"; $arr1 = explode(" ", $date1); $arr2 = explode(" ", $date2); $arrdate1 = explode("-", $arr1[0]); $arrdate2 = explode("-", $arr2[0]); $arrtime1 = explode(":", $arr1[1]); $arrtime2 = explode(":", $arr2[1]); $timestamp2 = (mktime($arrtime2[0], $arrtime2[1], 0, $arrdate2[1], $arrdate2[0], $arrdate2[2])); $timestamp1 = (mktime($arrtime1[0], $arrtime1[1], 0, $arrdate1[1], $arrdate1[0], $arrdate1[2])); $difference = floor(($timestamp2 - $timestamp1)/86400); echo 'Разница между датами: '.$difference.' дня(-ей)'; ?> |
В результате получаем, что разница между этими датами составляет 33 дня. Кстати, функцию floor() мы применили для округления количества дней, а 86400 — именно столько секунд в одном дне.
| Время | Секунды |
|---|---|
| 1 минута | 60 |
| 1 час | 3600 |
| 1 день | 86400 |
| 1 неделя | 604800 |
Если же Вам требуется вычислить разницу между текущим днем и расчетным — вместо переменной timestamp2 используйте функцию time(), о которой было сказано в первой части данного обзора.
Хотел еще написать несколько примеров, касающихся преобразования даты, но этих двух частях все основнын преобразования оказались уже рассмотрены. Если будут какие-то вопросы, задавайте в комментариях — дополню тогда посты ответами на них.
Просьба к читателям.
Это была первая серия постов на тему PHP. Уже более года она мне стала очень близка. Напишите, пожалуйста, в комментариях, нравится ли вам тематика PHP, в каком направлении хотелось бы видеть посты? Может вас интересует разбор каких-то готовых решений, скриптов… Вобщем жду Вашей реакции.
Похожие посты
Этот блог находят по фразам:
Комментарии
Оставляй комментарии и попади в ТОП5 комментаторов!
11 комментариев на “Работа с датами в PHP. Часть 2”
Написать комментарий


(11 голосов, средний: 3,36 из 5)
Подписался на ваш блог. И если честно, так как интересуюсь и пользуюсь php (уже написал пару полезных для себя скриптов), хотел бы видеть и разборы уже готовых скриптов, и конечно же ваши скрипты, и небольшие php-решения.
Считаю, что все будет полезным.
2 SeoAdvicer
А какого плана интересуют скрипты?
Естественно связанные с SEO.
Мог бы оформить функцией. Удобнее было бы тырить.
…
Хм…
Я видел как это делается с помощью ДжавыСкрипт.
можно легко сравнить преобразовав даты к виду YYYY-MM-DD, если нужно узнать например больше или меньше
судя по некоторым комментам автор давно не чистил свой блог от спама…
а что касается поста про PHP, то подобных примеров публиковать КАТЕГОРИЧЕСКИ нельзя
новички будут учиться по таким примерам, и будут думать что это правильно…
возражения «все работает и результат верен» не принимаются — таким же принципом можно сравнивать секс с онанизмом.
В вашем примере 5 строк с explode можно заменить одним регулярным выражением.
это изящнее, быстрее работает и убережет от ошибки (например если пользователь при вводе даты введет не двоеточие а точку с запятой)
кстати я тоже пишу про PHP и если интересно, то меняюсь постовыми
А как можно сделать так, чтобы даты не в коде этом вписывать, а передавать в переменной в этот код.
измените на это кусок. а то глючит! оно путает дни с годами…
$timestamp2 = (mktime($arrtime2[0], $arrtime2[1], $arrtime2[2], $arrdate2[1], $arrdate2[2], $arrdate2[0]));
$timestamp1 = (mktime($arrtime1[0], $arrtime1[1], $arrtime1[2], $arrdate1[1], $arrdate1[2], $arrdate1[0]));
Я в шоке! Вообще-то есть функция strtotime() для этого