Перейти к содержанию
    

STM32F100 - работа со временем и датой

Задача - преобразовать количество секунд из RTC в строку даты и времени и обратное преобразование.

Имеются ли в Keil стандартные функции для этих целей? Пример использования, если можно.

Если нет, то поделитесь, пожалуйста, текстом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача - преобразовать количество секунд из RTC в строку даты и времени и обратное преобразование.

Имеются ли в Keil стандартные функции для этих целей? Пример использования, если можно.

Если нет, то поделитесь, пожалуйста, текстом.

//-----------------------------------------------------------------------------
//    DWORD int_to_time(DWORD x, DWORD *hh, DWORD *mm, DWORD *ss)
//-----------------------------------------------------------------------------
DWORD int_to_time(DWORD x, DWORD *hh, DWORD *mm, DWORD *ss)
{
    *ss = x % 60;
    x /= 60;
    *mm = x % 60;
    x /= 60;
    *hh = x % 24;
    x /= 24;
    return x;
}

//-----------------------------------------------------------------------------
//    DWORD    date_to_int(DWORD y, DWORD m, DWORD d)
//-----------------------------------------------------------------------------
DWORD    date_to_int(DWORD y, DWORD m, DWORD d)
{
    if(m < 3)
    {
        m += 12;
        y -= 1;
    }
    return ((y * 1461) >> 2) + ((m * 306 + 7) / 10) + d - 730533;
}

//-----------------------------------------------------------------------------
//    void int_to_date(DWORD jd, DWORD *y, DWORD *m, DWORD *d)
//-----------------------------------------------------------------------------
void int_to_date(DWORD jd, DWORD *y, DWORD *m, DWORD *d)
{
    int    aa, bb, cc, dd, ee, mm, xx;

    aa = jd + 2483589;
    bb = (aa * 4 + 3) / 146097;
    cc = aa - ((146097 * bb) >> 2);
    dd = (4 * cc + 3) / 1461;
    ee = cc - ((1461 * dd) >> 2);
    mm = ((5 * ee + 2) * 13707) >> 21;

    *d = ee - ((16043274 * mm + 209716) >> 19) + 1;
    *m = mm + 3 - 12 * ((mm * 27) >> 8);
    *y = 100 * bb + dd - 4800 + ((mm * 27) >> 8);
}

 

Корректно работает от 2000 до 2099 годов включительно.

Начало эпохи 01.01.2000 00:00:00.

 

Примеры

// установка
rtc_set_datetime(((date_to_int(dt->YYYY, dt->MM, dt->DD) * 24 + dt->hh) * 60 + dt->mm) * 60 + dt->ss);

// считывание
if(rtc_get_datetime(&datetime))
{
    datetime = int_to_time(datetime, &hh, &mm, &ss);
    int_to_date(datetime, &y, &m, &d);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем изобретать велосипед? time_t как раз лучше всего для этого. Смотрите <time.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...