Эту статью можно назвать прикладным творчеством. Ведь в ней будет речь не столько о том, чтобы сохранить что-то ценное в плане обучения, а речь пойдет о тех возможностях, которыми владею на настоящий момент, и они уже дают некую свободу реализации незатейливых проектов. Так вот, сегодняшний прагматичный проект будет о лунном календаре, или о фазах луны.
 Дело в том, что когда я в интернете искал лунный календарь или фазы луны. все было представлено в виде писанины, табличек, так скажем без наглядного и привлекательного. Я решил своими силами исправить ситуацию, и в итоге на странице можно найти наглядный пример с информацией о том. когда будет следующее полнолуние, о том. когда было последнее.

Лунный календарь (фазы луны): что надо знать

Начну наверное с исходных данных, их просто полезно знать для общего развития. А для вычисления нам необходимо будет знать среднее время для полного цикла луны, то есть с какой периодичностью луна возвращается в свои исходные состояния. Так вот, период для полного цикла луны составляет 29 суток 12 часов 44 минуты 2,82 секунды. На самом деле это время незначительно варьируется то в большую, то в меньшую сторону, но учитывать эти незначительные минуты не было никакого желания!
 Здесь надо обратить внимание на другое, на базовое полнолуние, то есть на то полнолуние, относительно которого и будем проводить расчет. Здесь пришло время рассказать о принципах алгоритма лунного календаря.

Алгоритм вычисления полнолуния в лунном календаре

Собственно начинаем логически мыслить. Во-первых у нас есть период (фаз). Во-вторых, наше настоящее время. В-третьих нам необходимо относительного чего-то считать. И тут просто беру одно из ближайших полнолуний на момент написания статьи (скрипта) это 9 марта 2020 года 20:47.
 Теперь делаем так. Из настоящего времени вычитаем время нашего полнолуния и делим на период (фазу). В итоге, mathround позволяет получить минимальное целое число при таком делении. Здесь нам важно знать, сколько таких фаз прошло с нашего базового полнолуния. Далее просто берем и из прошедшего времени с сейчас до базового полнолуния вычитаем количество периодов (фаз) умноженное на саму фазу. Вот теперь вроде как все...

Далее в зависимости от того, сколько дней прошло с последнего полнолуния (именно это мы и находили выше), используем критерий смены состояния луны, то есть ее освещенности. Это отражаем в стилях для блока через оператор if, используя 1/8 периода для отражения изменений. Это уже просто! Собственно теперь взгляните на наглядное пособие. На этой странице есть луна, условная луна, и к ней информационный надписи, когда у нас было последнее полнолуние и когда будет следующее.

* - ... а да, конечно со временем из-за незначительных неточностей время вычисления полнолуний может чуть сдвинуться, так как период у лунного календаря плавающий. Поэтому будет правильно время от времени корректировать полнолуние на самое "свежее". Не так часто, но все же!

Посмотреть код

Еще одна версия того же самого, но с базой праздников.

Посмотреть код