Скрипт, который считает, сколько дней осталось до дня рождения
Хорошо ли получилось?
<?php
$now = date('d.m.Y'); //сейчас
$nowArr = explode('.', $now);
$monthNow = date('t', mktime(0, 0, 0, $nowArr[1], $nowArr[0], $nowArr[2])); //текущий месяц
$birthday = '23.03.1994'; //день рождение
$arr = explode('.', $birthday);
$monthBirthday = date('t', mktime(0, 0, 0, $arr[1], $arr[0], $arr[2])); //месяй день рождения
$rest = $monthBirthday - $arr[0]; //отсёк остальные дни, которые идут после моего дня рождения в этом месяце.
$days = 0;
for($i = $nowArr[1]; $i <= 12; $i++) {
$days = $days + date('t', mktime(0, 0, 0, $i, $nowArr[0], $nowArr[2])); // количество дней до конца года сначала месяца
if($i == $arr[1]) break;
if($i == 12) {
for($j = 1; $j <= $arr[1]; $j++) {
$days = $days + date('t', mktime(0, 0, 0, $j, $nowArr[0], $nowArr[2])); // количество дней до конца нужного месяца сначала месяца
}
}
}
echo $days - $nowArr[0] - $rest - 1;
|
Цитата:
|
По-моему букаф много.
<?php
$bd=preg_replace('#\d{4}#',$cur_year=date('Y'),'11.12.1994');
if(strtotime('today')>strtotime($bd))
$bd=str_replace($cur_year,1+$cur_year,$bd);
$Interval=(new DateTime())->diff(new DateTime($bd));
$months=$Interval->format('%m');
$days=$Interval->format('%d');
echo 'Осталось ',
$months>0?$months.' '.plural($months,array('месяц','месяца','месяцев')).' ':null,
$days>0?$days.' '.plural($days,array('день','дня','дней')):null;
//© https://gist.github.com/fomigo/2382775
function plural($n,$forms){
return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
}
http://sandbox.onlinephpfunctions.co...c8f529f439e3f6 |
:write: ещё бы 1 месяц, 2 месяца, 5 месяцев :)
|
рони, поправил скрипт.
|
Nexus,
:thanks: |
Цитата:
|
Цитата:
Можно перевести $bd в unix, тогда будет точно корректно сравнивать. Upd. Согласен, ошибка. Поправил. |
Nexus,
можно и строки, но формат даты должен быть европейский - год, месяц, число. Хотя используется же DateTime, так почему не использовать его на все 100, зачем эти махинации $bd=preg_replace('#\d{4}#',$cur_year=date('Y'),'11 .12.1994');, $bd=str_replace($cur_year,1+$cur_year,$bd);? |
Цитата:
Продемонстрируйте, пожалуйста, на что "DateTime" еще способен. Полагаю вы поняли смысл модифицирования строки с датой рождения. |
//получение даты из строкового представления в формате Ymd или dmY, любое представление и разделитель будут корректно обработаны
$timestamp = strtotime(дата или дата/время или английская строковая нотация)
//создание объекта DateTime из timestamp
new DateTime("@timestamp")
//установка даты
$date = new DateTime()
$date->setDate(год, месяц, день) //которые можно получить из любого источника
//и т.д., и т.п.
|
laimas, может я не совсем догоняю, но это ведь куда геморойнее получается, чем просто изменить строку.
Зачем так извращаться? PS. Суть тех двух строк была в том, что они делали прошедшую дату будущей и скрипт из-за этого рассчитывал именно оставшееся время до birth day, а не прошедшее с этого дня время. |
Цитата:
Более того, корректно все таки работать с датой/временем, а не с датой уже потому, что проверка на больше ли одна дата другой не имеет смысла - не может текущая дата быть меньше даты дня рождения, в противном случае это человек, который только родится в будущем, но уже живой. |
Цитата:
Когда говорят фразу "я приду на твой др" вы же не думаете, что пользователь сконструирует машину времени и вернется в прошлое. Поэтому в контексте этой задачи дата bd обязана быть в будущем времени. Если я не приведу bd к будущему времени, то узнаю не сколько осталось до bd, а сколько прошло времени с этого дня. Код ниже находит возраст пользователя, каким образом из этого состояния можно получить кол-во дней до будущего др я не могу, пока что, сообразить.
<?php
$bd='11.12.1994';
$bd=new DateTime($bd);
$now=new DateTime();
$Interval=$now->diff($bd);
$months=$Interval->format('%m');
$days=$Interval->format('%d');
echo 'Осталось ',
$months>0?$months.' '.plural($months,array('месяц','месяца','месяцев')).' ':null,
$days>0?$days.' '.plural($days,array('день','дня','дней')):null;
//© https://gist.github.com/fomigo/2382775
function plural($n,$forms){
return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
}
|
Цитата:
PS. Чтобы не мурыжить и не развивать баталий :) У вашего друга День рождения, вы приходите и "С Днюхой, друган!", или же "Осталось 0 месяцев, 0 дней, откупоривай!"? То есть date->diff(date) дает ответ - поздравлять или нет, зачем здесь условие? Мы и так знаем, что дата может быть меньше или разность дат равна 0. Мы без всяких предварительных условий узнаем,... так и тянуться руки подменить "to be or not to be" на "drink or not drink". :) |
Цитата:
|
Да что за глюки с форумом.
Не важно, отрицательный результат, это значит уже пили. ) |
Цитата:
Товарищ цитирует строку. echo "Lorem ipsum dolar"; На что заметит - "Это не правильно строки в пшп обрамляются в одинарные кавычки." - Спасибо! Поправил. echo 'Lorem ipsum dolar'; - Не правильно. Dolar пишется через "о". - Согласен, ошибка. Поправил. Только не правильно пишется слитно... |
Цитата:
Как адекватно и без условия решить задачу - хз. Будет интересно взглянуть на ваше решение. |
Rasy, не понял смысла вашего сообщения.
|
Цитата:
Мы ведь можем и иначе определить пора или нет, зная в каком дне года рождение, сравнив его с текущим днем года (с поправкой на високосный год): false - поздравляем, меньше - ждем, больше - уже выпито. |
Цитата:
|
| Часовой пояс GMT +3, время: 16:08. |