Іноді контролеру варто знати, чи високосний зараз рік

Задач, що пов’язані з точним орієнтуванням контролера у часі є багато. Але дозвольте нам побудувати і викласти цей матеріал на одному чи кількох простих прикладах.

Що таке високосний і невисокосний роки

Вікіпедія докладно дає визначення високосного і не високосного року, тож наведемо цитату, щоб відновити у пам’яті :

Високо́сний рік – рік у юліанському та григоріанському календарях, кількість днів у якому становить 366 – на одну добу (зимовий день) більше, ніж у звичайному (невисокосному) році. У такий рік місяць лютий має не 28, а 29 днів.

Приклади задач із застосування ознаки високосного року

Приклад 1: До кінця року залишилося стільки-то днів

Припустимо, що нам потрібно навчити наш пристрій повідомляти користувачів написом на дисплеї, що до кінця року залишилося стільки-то днів. 

Також, це може бути не кількість днів до кінця року, а кількість днів до будь-якої іншої дати – до весни, до дня народження, до початку опалювального сезону, до автоматичного переходу провітрювання на літній режим. І до зарплати? – і до зарплати.

Також цілком ймовірно, що нам потрібно просто вивести на екран майбутнього розумного годинника фактичні дані типу: “високосний рік”. Чому? – бо це може бути прохання майбутніх користувачів, виявлене за результатами опитування чи фокус групи.

Приклад 2: Скільки днів пройшло з початку року

Ще одним прикладом необхідності у контролера мати ознаку чи високосний рік, можна навести більш складні ситуації, коли контролер має ретроспективно виконувати статистичну обробку накопичених даних з переходом через добу. Виникають дуже прості математичні задачі, на кшталт знаходження середнього арифметичного, але котрі потребують знати, наприклад, скільки днів пройшло з початку року, щоб відшукати середнє значення тієї чи іншої фізичної величини, тощо. Таким чином можуть проводитися розрахунки витрат ресурсів (вода, газ електроенергія) або ж отримана доза опромінення, якщо йдеться про дозиметри і багато інших задач.

І навіть якщо ми маємо підключення до інтернет і отримуємо синхронізований час через SNTP (Simple Network Time Protocol), до речі, підтримка якого є в прошивці NodeMCU. або якщо ми маємо енергонезалежний RTC-годинник (Real Time Clock) на борту і дані відміток часу для запису у журнал ми беремо з RTC, нам все одно потрібно знати, скільки днів було у лютому цьогоріч, тобто у місяці, що вже давно минув.

Примітка А. Розповсюджений RTC-годинник DS3231, візьмемо цей чіп як галузевий технологічний орієнтир,  має вбудований механізм компенсації високосного року до 2100 року, але цей чіп не має комірки пам’яті, з якої ми могли б напряму отримати ознаку, чи є поточний рік високосним. Докладно дивись Maxim Integrated DS3231 Datasheet за посиланням ( Maxim Integrated DS3231 ), Figure1. Timekeeping Registers на сторінці 11.

Примітка Б. C-модулі sntp. та rtctime. надають інструменти для того, щоб окрім дати та часу отримати значення порядкового дня року. Ба більше, згадані модулі сумісні з концепцією високосного року (31 грудня є 366-м днем) і звичайного року (31 грудня є 365-м днем) і автоматично виконують компенсацію. Але ці модулі не повертають окремої ознаки, чи є поточний рік високосним. Тож, знаючи порядковий номер дня року, ми все ще не знаємо, скільки ж днів залишилося до кінця року. У перевірочному коді Lua, що наведено нижче, все виглядає просто, оскільки для перевірки ми вказали конкретний Unix Epoch Timestmap, як для високосного року так і для звичайного. В реальних умовах – умовах контролера – показані підходи не дадуть жодної корисної функціональності з точки зору перевірки чи є рік високосним, бо ми маємо лише поточний timestamp і не можемо засобами контролера згенерувати такий для 31.12.хххх з майбутнього, щоб перевірити чи рік високосний.

Перевірочний код Lua для NodeMCU:

Зверніть увагу, що даний код і відповідна функціональність буде працювати лише за наявності в прошивці NodeMCU C-модуля rtctime., а також, якщо ви плануєте виконувати синхронізацію часу через Інтернет, то додатково потрібно включити до прошивки C-модуль sntp.

Висновки

Всі наведені приклади різноманітних ситуацій, поєднує загальна проблема – контролер може все знати про поточні дату і час, але іноді нам потрібно точно знати: 

  • або, скільки днів минуло з початку року, 
  • або скільки днів до кінця року ще залишилося. 

Розрахунок кількості днів є можливим, лише якщо ми отримаємо і врахуємо ознаку чи високосний зараз рік.

Звісно ж, існує можливість визначення високосного року шляхом математичного розрахунку. У публічному доступі в мережі Інтернет є відповідні алгоритми. 

Нашою метою було навести приклади, коли це може бути потрібно і у чому є проблеми з вирішенням описаних задач. Сподіваємося, що ми досягли своєї мети і розповіли та показали вам чергові корисності. Також ми маємо готові комерційні модулі на Lua, що вирішують описані задачі – рекомендуємо ознайомитися, а якщо сподобається, придбати.

Продукти за темою

Якщо ви шукаєте готове рішення цієї задачі, пропонуємо вам переглянути наші програмні продукти. Це не дуже складні програми, які ми розробили, відлагодили і перевірили, щоб наші клієнти могли одразу їх застосовувати:

Модуль визначення чи є рік високосним чи ні –  alterstrategy.com/product/isleapyear/ 

Модуль визначення кількості днів, що залишилася до Нового року – alterstrategy.com/product/daystillny/