Как считать время до следующего дня недели?

Я хочу сделать в Arduino обратный отсчет, который показывает, сколько дней, часов и минут осталось до 12:00 пятницы. В моей программе я использовал функцию в php strtotime('следующая пятница'), которая, таким образом, могла вычислить дифференциальную метку времени и показать, сколько времени осталось до 12:00 пятницы.

Есть ли в Arduino функция strtotime('следующая пятница')? У меня есть RTC, который показывает только текущую дату и время, но не показывает текущий день недели.

ИЗМЕНИТЬ: У меня есть решение

У нас есть день недели. Мы умножили на 86400.
У нас есть час. Умножаем на 3600.
У нас есть минутка. Мы умножили на 60.
Добавить все.
Вычтите это из 604800.

nextFriday = 604800-((день недели * 86400)+(сейчас.час()*3600)+(сейчас.минута()*60)+сейчас.секунда());

Важно, пятница - это номер недели "0". пятница = 0; суббота = 1; и т.д...

, 👍1

Обсуждение

Большинство RTC имеют поле [dayOfWeek](https://github.com/adafruit/RTClib/blob/master/RTClib.h#L24)., @Gerben

В C/C++ это `strtotime("следующая пятница") — обратите внимание на двойные кавычки. Одинарные кавычки делают нечто совсем другое., @Nick Gammon


2 ответа


1

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

Я обычно использую в своем программировании эпоху UNIX (главным образом потому, что я фанат UNIX), то есть первое января 1970 года (01/01/1970). Это год, месяц, день, час, минута и секунда 0.

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

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

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

Например, в библиотеке времени Arduino есть функции для расчета дней недели и преобразования в формат "time_t" (секунды). с эпохи), которые можно использовать для определения разницы во времени. Например, если вы знаете, что сегодня вторник, и хотите следующую пятницу, то вы знаете, что пятница наступит через 3 дня в будущем, поэтому вы можете получить текущее время в секундах от эпохи, а затем добавить к этим трем дням секунды (3 × 60 × 60 × 24) к этому времени, чтобы получить такое же время суток в следующую пятницу.

,

0

Существуют общие примеры, например Определение дня недели — Википедия.

В приведенных ниже выражениях на языке C y, m и d — это, соответственно, целые переменные, представляющие год (например, 1988). , месяц (1–12) и день месяца (1–31).

        (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7

Также см. StackOverflow — Программа C для поиска дня недели указанная дата.

,