Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.11.2017, 00:13
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

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

<?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;
Ответить с цитированием
  #2 (permalink)  
Старый 08.11.2017, 00:30
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от DivMan
Хорошо ли получилось?
Плохо, а почему, в предыдущем разделе говорилось.
Ответить с цитированием
  #3 (permalink)  
Старый 08.11.2017, 09:44
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

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

Последний раз редактировалось Nexus, 08.11.2017 в 12:19.
Ответить с цитированием
  #4 (permalink)  
Старый 08.11.2017, 10:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

ещё бы 1 месяц, 2 месяца, 5 месяцев
Ответить с цитированием
  #5 (permalink)  
Старый 08.11.2017, 10:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

рони, поправил скрипт.
Ответить с цитированием
  #6 (permalink)  
Старый 08.11.2017, 10:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Nexus,
Ответить с цитированием
  #7 (permalink)  
Старый 08.11.2017, 11:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Nexus
if(date('d.m.Y')<$bd)
Это не правильно, сравнение будет некорректным.
Ответить с цитированием
  #8 (permalink)  
Старый 08.11.2017, 12:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

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


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

Последний раз редактировалось Nexus, 08.11.2017 в 12:21.
Ответить с цитированием
  #9 (permalink)  
Старый 08.11.2017, 12:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Nexus,
можно и строки, но формат даты должен быть европейский - год, месяц, число. Хотя используется же DateTime, так почему не использовать его на все 100, зачем эти махинации
$bd=preg_replace('#\d{4}#',$cur_year=date('Y'),'11 .12.1994');,
$bd=str_replace($cur_year,1+$cur_year,$bd);?
Ответить с цитированием
  #10 (permalink)  
Старый 08.11.2017, 13:27
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести кол-во дней до дня Рождения plug-ugly Общие вопросы Javascript 3 14.09.2017 10:16
Шуточный скрипт "До начала каникул осталось..." rustik-yes Общие вопросы Javascript 11 20.08.2016 16:05
Не получается доработать скрипт калькулятора последнего дня отпуска insider999 Общие вопросы Javascript 15 22.07.2016 15:35
Написать скрипт который сможет подставить атрибутам название из title. Donso Работа 6 26.01.2016 20:04
Скрипт, который сам работает, даже когда я оффлайн Vladislav AJAX и COMET 2 30.04.2013 18:32