БлогNot. Дни золотого сечения в году

Дни золотого сечения в году

Вспоминая о золотом сечении, мы не пытались рассмотреть обычный календарный год как интервал дней, который тоже можно разбить в бессмертной пропорции.

В не-високосном году наиболее точно в пропорции золотого сечения год разбивают даты 19 мая и 14 августа, в високосном - 19 мая и 13 августа. Но константа Φ нравится мне больше, чем φ, так что пусть днём Золотого Сечения будет 14 августа :)

Разумеется, расчёты приблизительны и сделаны с точностью до суток показанным ниже маленьким скриптом. Пригодиться из него может простой метод getDayOfYear (номер для в году для даты-аргумента dt, начиная с единицы) и не самый лаконичный, но простой и безопасный способ организации цикла по датам от startDate до endDate включительно, в нашем случае по всем дням года year.

<div id="goldLog">
<script>
function getGoldDays (year, id) { //Год и id раздела для вывода строки
 function isLeapYear (year) { //Високосный ли год
  if ((year & 3) != 0) return false;
  return ((year % 100) != 0 || (year % 400) == 0);
 }

 function getDayOfYear (dt) { //Номер дня в году с единицы
  let dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
  let mn = dt.getMonth();
  let dn = dt.getDate();
  let dayOfYear = dayCount[mn] + dn;
  if (mn > 1 && isLeapYear(dt.getFullYear())) dayOfYear++;
  return dayOfYear;
 }

 function strDate (dt) { //дата в формате "31 декабря" из Date dt
  var monthes = [ 'января','февраля','марта','апреля','мая','июня',
   'июля','августа','сентября','октября','ноября','декабря' ];
  return dt.getDate() + ' ' + monthes[dt.getMonth()];
 }

 let startDate = new Date (year,0,1), endDate = new Date (year,11,31);
 let startTime = startDate.getTime(), endTime = endDate.getTime();
 let cnt = 365;
 if (isLeapYear(year)) cnt++;
 let Phi = (Math.sqrt(5.)+1)/2., minPhi = 2, minDate1; //1.618
 let phi = (Math.sqrt(5.)-1)/2., minphi = 2, minDate2; //0.618
 for (let loopTime = startTime; loopTime <= endTime; loopTime += 86400000) {
  let loop = new Date (loopTime);
  let n = getDayOfYear (loop);
  let d;
  if (n < cnt / 2) {
   d = Math.abs (n / (cnt - n) - phi);
   if (d < minphi) { minphi = d; minDate1 = loop; }
  }
  else if (n < cnt) {
   d = Math.abs (n / (cnt - n) - Phi);
   if (d < minPhi) { minPhi = d; minDate2 = loop; }
  }
  //console.log (strDate(loop) + ' (' + n + ') ' + d + "\n");
 }
 let el = document.getElementById(id);
 el.innerHTML += 'Год '+year+': '+strDate(minDate1)+', '+strDate(minDate2)+'<br>'+"\n\n";
} //getGoldDays

 getGoldDays (2019,'goldLog');
 getGoldDays (2020,'goldLog');
</script>
<noscript>Нужен включённый JavaScript для работы приложения</noscript>
</div>

теги: числа javascript дата

15.12.2019, 17:13; рейтинг: 264