Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Скрипт, который считает, сколько дней осталось до дня рождения (https://javascript.ru/forum/server/71294-skript-kotoryjj-schitaet-skolko-dnejj-ostalos-do-dnya-rozhdeniya.html)

DivMan 08.11.2017 00:13

Скрипт, который считает, сколько дней осталось до дня рождения
 
Хорошо ли получилось?

<?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;

laimas 08.11.2017 00:30

Цитата:

Сообщение от DivMan
Хорошо ли получилось?

Плохо, а почему, в предыдущем разделе говорилось.

Nexus 08.11.2017 09:44

По-моему букаф много.
<?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

рони 08.11.2017 10:23

:write: ещё бы 1 месяц, 2 месяца, 5 месяцев :)

Nexus 08.11.2017 10:34

рони, поправил скрипт.

рони 08.11.2017 10:49

Nexus,
:thanks:

laimas 08.11.2017 11:46

Цитата:

Сообщение от Nexus
if(date('d.m.Y')<$bd)

Это не правильно, сравнение будет некорректным.

Nexus 08.11.2017 12:08

Цитата:

Сообщение от laimas
сравнение будет некорректным

Вроде бы корректно работает.
Можно перевести $bd в unix, тогда будет точно корректно сравнивать.


Upd. Согласен, ошибка. Поправил.

laimas 08.11.2017 12:48

Nexus,
можно и строки, но формат даты должен быть европейский - год, месяц, число. Хотя используется же DateTime, так почему не использовать его на все 100, зачем эти махинации
$bd=preg_replace('#\d{4}#',$cur_year=date('Y'),'11 .12.1994');,
$bd=str_replace($cur_year,1+$cur_year,$bd);?

Nexus 08.11.2017 13:27

Цитата:

Сообщение от laimas
зачем эти махинации

Потому что не знаю, как обойтись без них.
Продемонстрируйте, пожалуйста, на что "DateTime" еще способен.

Полагаю вы поняли смысл модифицирования строки с датой рождения.


Часовой пояс GMT +3, время: 19:28.