Вычисление отсрочки старта приготовления каши на завтра

Иногда я живу один и ставлю с вечера кашу в мультиварке, чтобы она приготовилась к времени моего завтрака. 

И раньше я постоянно путался — какую отсрочку старта поставить вечером, чтобы каша была готова к определенному времени утром?  

В итоге составил табличку с формулами и написал код Google Apps Script, чтобы знать какое точное время отсрочки старта готовки задавать на старой мультиварке.

Проблема выбора времени для приготовления каши

Время завтрака очень важно и я никогда его не пропускаю. Обычно завтракаю довольно рано. Проблема расчёта времени действительно актуальна для меня. Пытался считать отсрочку старта приготовления каши на завтра на калькуляторе — как-то странно и долго.

Старая мультиварка

Старая мультиварка

Структурированный подход — таблица

Подумал, что для решения этой задачи можно использовать Google Таблицы и создать формулу, которая будет рассчитывать время отсрочки старта мультиварки в зависимости от времени, когда нужна готовая каша.

В первой колонке через формулу задаю текущее время:

=TIME(HOUR(NOW()); MINUTE(NOW()); SECOND(NOW()))

Во второй указываю время, когда каша уже должна быть готова, например, 06:00.

В третьей колонке пишу продолжительность приготовления каши в часах, например для гречки 00:40.

В последней колонке составил простую формулу, которая будет вычислять время отсрочки старта мультиварки.

Таблица тут.

Таблица

Таблица «Отсрочка старта приготовления каши на завтра»

Автоматизация процесса с помощью скрипта Google Apps

Функция CALCULATE_DELAY вычисляет необходимую задержку запуска мультиварки, чтобы каша была готова в указанное время. Требуется всего два параметра: желаемое время завершения и время приготовления. Распишу что делает код:

  1. Проверяю то, что ввод рассматривается как строка:

desiredCompletionTime = desiredCompletionTime.toString();
cookingTime = cookingTime.toString();

Функция начинается с преобразования входных параметров в строки, чтобы гарантировать их правильную дальнейшую обработку.

  1. Получение текущего времени

var currentDateTime = new Date();
var currentHours = currentDateTime.getHours();
var currentMinutes = currentDateTime.getMinutes();

Текущая дата и время извлекаются с помощью функции »new Date()». Это дает функции базовую линию для расчета задержки.

  1. Парсим желаемое время завершения

var desiredParts = desiredCompletionTime.split(':');
var desiredDateTime = new Date(currentDateTime);
desiredDateTime.setHours(parseInt(desiredParts[0], 10));
desiredDateTime.setMinutes(parseInt(desiredParts[1], 10));
desiredDateTime.setSeconds(0);

Желаемое время завершения разбито на часы и минуты. Эти значения затем используются для установки желаемого времени завершения для нового объекта даты (»desiredDateTime»).

  1. При необходимости корректируем дату на завтра

if (desiredDateTime <= currentDateTime) {
  desiredDateTime.setDate(desiredDateTime.getDate() + 1);
}

Если желаемое время завершения раньше текущего времени, функция предполагает, что время завершения приходится на следующий день, и соответствующим образом корректирует дату.

  1. Парсим время приготовления

var cookingParts = cookingTime.split(':');
var cookingTimeMinutes = parseInt(cookingParts[0], 10) * 60 + parseInt(cookingParts[1], 10);

Время приготовления разбивается на часы и минуты, а затем преобразуется в общее количество минут для облегчения расчета.

  1. Рассчитываем время начала приготовления

var startCookingTime = new Date(desiredDateTime.getTime() - cookingTimeMinutes * 60000);

Функция рассчитывает точное время запуска мультиварки путем вычитания времени приготовления (в миллисекундах) из желаемого времени завершения.

  1. Рассчитываем необходимую задержку исходя из текущего времени в минутах

var delayMinutes = (startCookingTime - currentDateTime) / 60000;

Время задержки в минутах рассчитывается путем нахождения разницы между временем начала приготовления и текущим временем с последующим преобразованием этой разницы из миллисекунд в минуты.

  1. Преобразуем время отсрочки в часы и минуты

var delayHours = Math.floor(delayMinutes / 60);
var delayRemainingMinutes = Math.round(delayMinutes % 60);

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

  1. Форматируем задержку как ЧЧ: ММ

Logger.log(`Результат:\n${('0' + delayHours).slice(-2) + ':' + ('0' + delayRemainingMinutes).slice(-2)}`)
return ('0' + delayHours).slice(-2) + ':' + ('0' + delayRemainingMinutes).slice(-2);

Время задержки форматируется в формате «ЧЧ: ММ» и регистрируется в целях отладки.

Тестирую функцию CALCULATE_DELAY:

function test() {
  CALCULATE_DELAY("05:20:00", "00:40:00")
}

В этом тестовом примере рассчитывается время задержки начала для каши, которая должна быть готова к 05:20 утра, а приготовление занимает 40 минут.

Полностью весь код выглядит следующим образом:

/**
 * Расчет времени отсрочки старта для мультиварки
 * 
 * https://habr.com/ru/articles/833648/
 */

function CALCULATE_DELAY(desiredCompletionTime, cookingTime) {
  desiredCompletionTime = desiredCompletionTime.toString();
  cookingTime = cookingTime.toString();
  var currentDateTime = new Date();
  var currentHours = currentDateTime.getHours();
  var currentMinutes = currentDateTime.getMinutes();
  var desiredParts = desiredCompletionTime.split(':');
  var desiredDateTime = new Date(currentDateTime);
  desiredDateTime.setHours(parseInt(desiredParts[0], 10));
  desiredDateTime.setMinutes(parseInt(desiredParts[1], 10));
  desiredDateTime.setSeconds(0);
  if (desiredDateTime <= currentDateTime) {
    desiredDateTime.setDate(desiredDateTime.getDate() + 1);
  }
  var cookingParts = cookingTime.split(':');
  var cookingTimeMinutes = parseInt(cookingParts[0], 10) * 60 + parseInt(cookingParts[1], 10);
  var startCookingTime = new Date(desiredDateTime.getTime() - cookingTimeMinutes * 60000);
  var delayMinutes = (startCookingTime - currentDateTime) / 60000;
  var delayHours = Math.floor(delayMinutes / 60);
  var delayRemainingMinutes = Math.round(delayMinutes % 60);
  Logger.log(`Результат:\n${('0' + delayHours).slice(-2) + ':' + ('0' + delayRemainingMinutes).slice(-2)}`)
  return ('0' + delayHours).slice(-2) + ':' + ('0' + delayRemainingMinutes).slice(-2);
}

function test() {
  CALCULATE_DELAY("05:20:00", "00:40:00")
}

Итоги

В быстро меняющемся мире, в котором мы живем, автоматизация повседневных задач может сэкономить драгоценное время и усилия. Этот код, написанный на языке Google Apps Script, поможет рассчитать точное время отсрочки запуска мультиварки.

Автор: Михаил Шардин

5 августа 2024 г.

© Habrahabr.ru