Высчитать дату, которая наступит через Х дней

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Есть ли какой-нибудь красивый способ для просчета даты, которая наступит через Х дней?

К примеру, сегодня 17 июня, и мне необходимо, чтобы, допустим, через 45 дней выполнилось какое-то действие. 

Arduino + ds1307

На сколько я понимаю, нужно просчитать, какое число какого месяца будет через 45 дней, и сравнивать текущее число/месяц с высчитанным. Вопрос в том, как его высчитать. Поделитесь куском кода, пожалуйста. Буду благодарна :-)

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Я тут посмотрела, что изнальный формат времени ds1307 - unix time. У меня стандартная библиотека для ds1307. Есть ли в ней нужная мне функция?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

функция называется unixtime() - показывает секунд с 1970 года обычно есть в стандарном классе DateTime

также в этом классе есть инициализатор

45дней = 45*24*60*60 секунд

DateTime now = rtc.now();
DateTime end = DateTime(now.uinxtime() + 45*24*60*60);//дата и время через 45 дней

 

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Видимо, у меня не совсем стандартная библиотека. Можете дать ссылку на ту библиотеку, которую Вы использовали (вызов функции rtc.now();)

А библиотека DateTime умеет конвертировать из unix time?

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Люди, помогите пожалуйста. С паяльником плохо дружу, а плата уже разведена, i2c дисплей висит на a5 и a6, ds1307 на a3 и a4.

Я устанавливаю текущие время и дату, устанавливаю продолжительность работы устройства (оно подключено через реле) в днях. Мне нужно, чтоб устройство выключилось через заданный промежуток времени. В моей библиотеке для часов нет функции unixtime(). В библиотеке RTClib я не нашла, где можно изменить пины, к которым подключены часы.

Есть ли алгоритм для вычисления unix времени? Или, может, эту задачу можно решить еще как-то?

Не хочу просто вводить дату отключения, хочу вводить кол-во дней.

В гугле уже все ссылки поменяли цвет )))

Snubist
Offline
Зарегистрирован: 18.02.2013

Как кастыль, можно попробобовать подключить библиотеку RTClib, но использовать только функции datetime, а общение с часами вести своей библиотекой.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вообще i2c хардварный интерфейс. https://github.com/adafruit/RTClib

и сама DateTime

art100
Offline
Зарегистрирован: 09.03.2014

NeiroN пишет:

Вообще i2c хардварный интерфейс. https://github.com/adafruit/RTClib

и сама DateTime

там недалеко и до

leshak
Offline
Зарегистрирован: 29.09.2011

Эпический барабан...

Да зачем вам вообще эти даты и конвертации?

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

Ну вот скажем вот эта: http://playground.arduino.cc/Code/Time

У нее есть  "now();             // Returns the current time as seconds since Jan 1 1970"

Пофиг называется от unixtimestamp или нет. Пофиг с 1970 или с 2000-чного будет возвращать. Главное что "в секундах с какого-то момента" (на самом деле пофиг что в секундах. хоть в попугаях. главное что линейно и "цифра не может обнулиться/переполниться").

Предположим что сейчас она нам вернула цифру "5555". А мы хотим что-бы у нас точ-то сработало "через 3 дня". Ну... переводим дни в секунды. 3*24*60*60=259200

Добавляем их в текущему времени: 5555+259200=264755

Все. Нам фиолетово "какая это дата". Нужно "сработать", когда now() вернет цифру 264755. А произойдет это - через три дня. Вне зависимости от того сколько дней в месяце, високосный год или нет и т.п.

 

Igor A.
Offline
Зарегистрирован: 03.01.2014

Перевод времени из Unix time в календарную дату очень простой, например вот

http://ru.m.wikipedia.org/wiki/%D0%AE%D0%BB%D0%B8%D0%B0%D0%BD%D1%81%D0%B...

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Спасибо, ребят. Решила не заморачиваться с библиотеками, сделала таким вот образом, считая количество дней за прошедшие года, начиная с 0, прибавляя по 1 дню за каждый 4й високосный год, отнимая по 1 дню каждый сотый, и прибавляя по 1 дню за каждый 400й год, плюс количество дней, прошедших с начала года из массива, плюс по 1 дню, если месяц больше февраля и год - високосный:

#include <DS1307.h>
DS1307  rtc(16, 17);
Time  tm;
unsigned long ddd;

void setup()
{
  rtc.halt(false);
  Serial.begin(9600);
}

void loop()
{
  tm = rtc.getTime();
  ddd = days();
  Serial.print("days=");
  delay(1000);
}


unsigned long days() {
  unsigned long d;
  unsigned long g = tm.year;
  int daysinyear[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  d = g*365+g/4-g/100+g/400;
  Serial.print("1 operation=");
  Serial.println(d);
  d = d+daysinyear[tm.mon];
  Serial.print("2 operation=");
  Serial.println(d);
  d = d+tm.date;
  if (tm.year == 2012 || tm.year == 2016 || tm.year == 2020 || tm.year == 2024){
    if (tm.mon >= 3) {
      d++;
    }
  }
  return d;
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

И это называется "не заморачиваться"? А потом еще нужно будет запомнить часы минуты секунды когда происходила установка. И потом еще их их проверять. (что-бы "сработало", не в полноч, а именно "через чере дня").

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

if( startTime &&  (rtc.now() - startTime)>=days*24*60*60){ 
   ..... 
    делаем что-то  через days дней
   ....

   startTime=0; // вырубаем отсчет
}

А "запускать отсчет", банальным

startTime=rtc.now()

P.S. Кстати2: "кстати, вы так и не признались никому что же это за "стандартаня библиотке..."

leshak
Offline
Зарегистрирован: 29.09.2011

А за упорство, и все-таки найденое решение (пусть и то которое не нравится некоторым ;)- конечно жирный плюс вам.