вычисление дня недели из даты

Тема в разделе "Arduino & Shields", создана пользователем MDV, 9 ноя 2015.

  1. MDV

    MDV Гик

    Всем доброго дня.
    Собственно вопрос по заголовку. Кто нибудь реализовал вычисление дня недели по дате.
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    а дата откуда берется?
     
  3. DrProg

    DrProg Вечный нерд

    Я реализовывал. Есть алгоритм, в интернете найти не проблема.
    В ЧРВ нет дня недели, во всяком случае в тех, с котооыми я сталкивался.
     
    ИгорьК нравится это.
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    как это нету? Даже тупая DS1307 умеет выдавать день недели.

    Но можно и вычислить, если очень надо:
    Код (C++):
    // в данной версии данные хранятся не в двоичной, а в двоично-десятичной системе
    unsigned char
    myhour, mymin, mysec,    // текушее время
    mydate, mymonth, myyear, // текущий календарь
    myday;                   // день недели


    // -------------------- вычислить день недели по дате --------------------------------------
    void date2day(void) {
    unsigned int y, m;

       y = bcd2bin(myyear);
       m = bcd2bin(mymonth);

       if (m > 2) { m -= 2;       }
       else       { m += 10; y--; }

       myday = (unsigned char)((bcd2bin(mydate) + y + (y>>2) + ((31 * m) / 12)) % 7);
     
       if (myday == 0) myday = 7;
    }//-----------------------------------------------------------------------------------------
     
    NikitOS нравится это.
  5. DrProg

    DrProg Вечный нерд

    Вот один из способов:
    Код (C++):
    byte doWeekCalc (byte DD, byte MM, byte YY) {        // вычисление дня недели
      byte doW;
      doW = (YY / 12) + (YY % 12) + ((YY % 12) / 4);     // индекс года
      byte iiM[] = {6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; // индекс месяца в табл
      doW += iiM[MM - 1];                                // индекс месяца выбраный
      if ((YY % 44) == 0) {                              // индекс високосного года
        if ((MM == 1) or (MM == 2)) doW--;
      }
      doW += DD;                                         // индекс дня
      doW = (doW % 7);
      return doW;
    }
    Он рабочий, но где то у меня есть короче, найти пока не могу, не дома я.
     
    volgoled и ИгорьК нравится это.
  6. MDV

    MDV Гик

    Время и дату беру из модема (Sim900) в формате [​IMG]
     
  7. 9xA59kK

    9xA59kK Гик

    Согласен с Tomasina, вот вырезка из даташита на DS1307
    Код (C++):
    Характеристики
    ........
    - часы реального времени (RTC) отсчитывают секунды, минуты, часы, дату месяца, месяц, день
    недели и год с компенсацией високосного года, действительной до 2100 года; ......
     
     
  8. DrProg

    DrProg Вечный нерд

    Из этого сначала нужно вырезать саму дату и время. При помощи функций работв с текстом.
    По моему если день недели там и есть, то он не вычисляется из даты, а так же должен быть установлен вместе с часами и батарейкой.
     
    Последнее редактирование: 9 ноя 2015
    ИгорьК нравится это.
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    разумеется, надо заранее установить корректные дату и время, само оно не образуется, расчета в ней нет.
     
  10. MDV

    MDV Гик

    Дату из строки достал.
    Буду дописывать математику
     
  11. volgoled

    volgoled Нерд

    спасибо Вам большое, переживаю за Вас, Вы все не дома? более короткий код так и не представили.
     
  12. MDV

    MDV Гик

    И этот код нормально вычисляет