Страница 1 из 2

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 03 сен 2013, 22:51
ursego
Предлагаю сверх-лёгкое решение, которое высвечивает сообщение в формате "Форуму 3 года 11 месяцев и 5 дней" с соблюдением правильности русского языка.

Показ возраста - штука нелишняя для молодого форума, и вот почему: предположим кто-то забрёл на форум, на котором всего несколько сот или тысяч сообщений. Как можно понять эту информацию? Если форум старый, то очевидно, что он "не состоялся", бежать от такого подальше! Но если форум появился недавно, то солидное число сообщений ещё просто не успело накопиться - стОит поглядеть что это за тусовочка... Конечно, можно просто указать дату создания, но предлагаемое решение, по-моему, элегантней (уж прикольней - точно! :ps_ih: ).

Следующий фрагмент надо просто вставить в HTML в том месте, где хотите показывать возраст (Перед правкой поставить в выбранном шаблоне кодировку UTF-8 без BOOM иначе будут кракозябры):

Код: Выделить всё

<!-- Высветить "Форуму ... лет ... месяцев и ... дней" BEGIN -->
<SCRIPT language=JavaScript>
<!--
var fD = [2012, 7, 25], d1 = 6, m1 = 4, tx = [], rz, d = new Date,
tD = [d.getFullYear (), d.getMonth (), d.getDate ()], dr = tD [2] - fD [2],
mr = tD [1] - fD [1], yr = tD [0] - fD [0], Y = 'год-года-лет',
M = 'месяц-месяца-месяцев', D = 'день-дня-дней', t = function (v, w) {
var x = w.toString ().split (''), y = x [x.length - 1], z = 0; if (w > 4 && w < 21
|| y == 0) z = 2; else if (y > 1 && y < 5) z = 1; else if (y > 4) z = 2; return ' ' + v.split ('-') [z]}
if (dr < 0) dr = tD [2] + d1, mr--; if (yr > 0 && mr < 0) yr -= 1; if (mr < 0) mr = tD [1] + m1; 
var yt = (yr) ? yr + t (Y, yr) : ''; if (yt) tx [tx.length] = yt;
var mt = (mr) ? mr + t (M, mr) : ''; if (mt) tx [tx.length] = mt;
var dt = (dr) ? dr + t (D, dr) : ''; if (dt) tx [tx.length] = dt;
if (tx.length == 1) rz = tx [0];
if (tx.length == 2) rz = tx.join (' и ');
if (tx.length == 3) rz = tx [0] + ', ' + tx [1] + ' и ' + tx [2];
document.write("Форуму <strong>" + rz + "</strong> (основан 25 авг 2012)");
-->
</SCRIPT>
<!-- Высветить "Форуму ... лет ... месяцев и ... дней" END -->
Даты замените на дату создания вашего форума (памятуя о том, что в джаваскрипте месяца нумеруются от 0 до 11 - именно поэтому у меня стоИт "7" для августа: "var fD = [2012, 7, 25]").

Наверно, джаваскрипт - не очень хорошее решение (калькуляцию лучше проводить на сервере, а не в браузере), но у меня этот скрипт только на морде форума, на которую форумчане в повседневной жизни обычно редко заходят.

Важный ремарк: автор кода - не я, мне его дали в готовом виде на форуме программистов (и автор разрешил опубликовать его здесь).

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 04 сен 2013, 04:52
DeaDRoMeO
Отлично, и модов не нужно))

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 12:43
DeaDRoMeO
Скрипт некорректно считает, допустим от 21 ноября 2009 года, тему в мусор скорее всего отправить придется

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 14:01
ursego
Ну так исправь чтоб было корректно, и человечество скажет спасибо! Функционал-то интереснейший.

Кстати, у меня вроде правильно работает:

Форуму 1 год и 26 дней (основан 25 авг 2012)

Но, возможно, ещё не наступила дата, когда скрипт заглючит.

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 14:22
DeaDRoMeO
Я в яве ноль, да и искать долго скрипт. Взял и поставил этот мод - https://www.phpbb.com/customise/db/mod/ ... e_on_index. Пример работы - напротив подфорума I-Valll

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 15:15
ursego
DeaDRoMeO писал(а):Пример работы - напротив подфорума I-Valll
Ничего не путаешь?

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 15:48
DeaDRoMeO
Чего мне путать то ???

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 15:53
ursego
Не знаю чего, но путаешь. На всякий случай повторю о чём речь в этой теме:
ursego писал(а):решение, которое высвечивает сообщение в формате "Форуму 3 года 11 месяцев и 5 дней" с соблюдением правильности русского языка
Решений, которые просто показывают сколько дней - уйма в интернете, у меня сначала такое стояло, но это "невкусно".

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 16:09
DeaDRoMeO
Теперь понял)

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 16:27
Олег В
У меня всё подсчитывает верно! :-00):
ursego, Спасибо! :uch_tiv:

[hide][/hide]

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 17:39
ursego
Олег В писал(а):ursego, Спасибо!
Пожалуйста от имени того программиста, который написал скрипт.
Олег В писал(а):У меня всё подсчитывает верно!
Честно говоря, я не очень обольщаюсь - вполне возможно, что баг проявляется при определённой комбинации дня, месяца и года (до которой я ещё не дошёл). У меня раньше другой скрипт стоял - показывал нормально, а когда форуму исполнился год, то вместо "1 год" высветил "12 месяцев".
DeaDRoMeO писал(а):Скрипт некорректно считает, допустим от 21 ноября 2009 года
А в чём конкретно косяк-то был? Какой возраст высветился?

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 17:54
Олег В
ursego писал(а):А в чём конкретно косяк-то был? Какой возраст высветился?
Вот что показывает если выставить дату DeaDRoMeO,

Код: Выделить всё

Форуму 3 года, 12 месяцев и 26 дней (основан 21 ноября 2009г)
Но 12 месяцев и 26 дней быть не может. должно быть так по моему

Код: Выделить всё

Форуму 4 года, 0 месяцев и 26 дней (основан 21 ноября 2009г)
но даже если не брать этот факт во внимание, всё равно подсчёт не верен. По итогу, правильно должно быть вроде так.

Код: Выделить всё

Форуму 3 года, 10 месяцев и 30 дней (основан 21 ноября 2009г)

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 18:02
Олег В
как по мне, правда с меня ещё тот математик. Ошибку создаёт именно этот момент 12 месяцев и 26 дней. Вот этот 13-ты месяц и путает все вычисления!

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 18:05
ursego
Ну, я когда дойду до проблем, тогда и буду думать как решить. Пока работает как швейцарские часы.

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 18:27
Олег В
ursego писал(а):Ну, я когда дойду до проблем, тогда и буду думать как решить.
Думаю что Вашему знакомому эту проблему решить будет не сложно и в данный момент. Зачем ждать проблем то? Швейцарские часы не должны требовать доработок в будущем. Их вообще разбирать не рекомендуется! :ne_ne_ne:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 20 сен 2013, 20:17
Олег В
В общем всё вроде заработало нормально.
Проблема с 13 -тым месяцем решается заменой. в строке

Код: Выделить всё

var fD = [2012, 7, 25], d1 = 6, m1 = 4, tx = [], rz, d = new Date,
заменить цифру 4 в m1 = на цифру 3.

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 21 сен 2013, 10:57
DeaDRoMeO
Олег В писал(а):заменить цифру 4 в m1 = на цифру 3.
Вот если бы получить код с комментариями, тогда проще было б, а так фиг поймешь за что отвечает какая то переменная

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 21 сен 2013, 15:20
ursego
Там проблема в некачественных именах переменных. Имя переменной должно дать исчерпывающий ответ на вопрос "ой, а шо это за переменная?" - да так, чтобы не было нужды в комментариях. Сам алгоритм-то пустяковый, но я как увидел эти клинические имена - сразу пропало желание возиться.

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 24 ноя 2013, 14:07
белк
Спасибо за простой скрипт. Удобно.

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Добавлено: 16 фев 2014, 03:23
ursego
Короче, задолбала меня глючность предыдущего скрипта (приходилось что-то менять 2 раза в месяц чтоб правильно показывал - то туда, то обратно) и я нашёл другой скрипт. Правда, он был англоязычный, ну а уж я русифицировал его как смог (начиная с объявления переменной res - это уже моя самодеятельность). В общем, ниже выкладываю готовый кусок джаваскрипта. Только не забудьте инициализировать переменные yearDob, monthDob и dateDob датой создания Вашего форума (не забывая, что индекс месяца, помещаемый в monthDob, на единицу меньше его порядкового номера т.к. в джаваскрипте месяца нумеруются с нуля - например, я помещаю туда 7, что значит "август"; на года и дни это не распространяется - я помещаю 2012 для 2012-го года и 25 для 25-го числа).

Правда, имеется баг - now.getYear() почему-то возвращает неправильный текущий год, так что я заполняю переменную yearNow просто числом 2014 (как исправлю - отпишусь).

Код: Выделить всё

<!-- Высветить "Форуму ... лет ... месяцев и ... дней" BEGIN -->
<SCRIPT language=JavaScript>
<!--
  var now = new Date();
  var today = new Date(now.getYear(),now.getMonth(),now.getDate());
 
  var yearNow = 2014; //now.getYear();
  var monthNow = now.getMonth();
  var dateNow = now.getDate();
 
  var yearDob = 2012;
  var monthDob = 7;
  var dateDob = 25;
  var age = {};
 
  yearAge = yearNow - yearDob;
 
  if (monthNow >= monthDob)
    var monthAge = monthNow - monthDob;
  else {
    yearAge--;
    var monthAge = 12 + monthNow -monthDob;
  }

  if (dateNow >= dateDob)
    var dateAge = dateNow - dateDob;
  else {
    monthAge--;
    var dateAge = 31 + dateNow - dateDob;
 
    if (monthAge < 0) {
      monthAge = 11;
      yearAge--;
    }
  }

  age = {
      years: yearAge,
      months: monthAge,
      days: dateAge
      };

var res = "Форуму "; // result

if (age.years == 1)
   res += "<strong>1</strong> год";
else if (age.years > 1 && age.years < 5)
   res += "<strong>" + age.years + "</strong> года";
else if (age.years >= 5)
   res += "<strong>" + age.years + "</strong> лет";

if (age.days == 0)
   res += " и ";
else
   res += ", ";

if (age.months == 1)
   res += "<strong>1</strong> месяц";
else if (age.months > 1 && age.months < 5)
   res += "<strong>" + age.months + "</strong> месяца";
else if (age.months >= 5)
   res += "<strong>" + age.months + "</strong> месяцев";

if ((age.years > 0 || age.months > 0) && age.days > 0)
   res += " и ";

if (age.days == 1 || age.days == 21)
   res += "<strong>" + age.days + "</strong> день";
else if (age.days == 2 || age.days == 3 || age.days == 4 || age.days == 22 || age.days == 23 || age.days == 24)
   res += "<strong>" + age.days + "</strong> дня";
else if (age.days >= 5)
   res += "<strong>" + age.days + "</strong> дней";

document.write(res);
-->
</SCRIPT>
<!-- Высветить "Форуму ... лет ... месяцев и ... дней" END -->