• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

TimeLib как отредактировать формат времени

leha_m1986

New member
Подскажите дураку, как при выводе времени в Blynk добавить 0 к минутам, если они меньше 10 ? Только начинаю осваивать, сильно не пинайте.
Код:
// Digital clock display of the time
void clockDisplay()
{
  // You can call hour(), minute(), ... at any time
  // Please see Time library examples for details

  String currentTime = String(hour()) + ":" + minute() + ":" + second();
  String currentDate = String(day()) + " " + month() + " " + year();
  Serial.print("Current time: ");
  Serial.print(currentTime);
  Serial.print(" ");
  Serial.print(currentDate);
  Serial.println();

  // Send time to the App
  Blynk.virtualWrite(V1, currentTime);
  // Send date to the App
  Blynk.virtualWrite(V2, currentDate);
}
 

Сергей_Ф

Moderator
Команда форума
Один из вариантов:
Код:
//String currentTime = String(hour()) + ":" + minute() + ":" + second();
String currentTime = String(hour()) + ":";
if ( minute() < 10 ) currentTime += 0;
currentTime += minute() + ":";
if ( second() < 10 ) currentTime += 0;
currentTime += second();
P.S. но это вообще плохой способ вывода времени
 
Последнее редактирование:

Ildarmustafin86

Active member
Как вариант использовать sprintf
Код:
sprintf(currentTime, "%02d:%02d:%02d", hour(), minute(), second());
 

Сергей_Ф

Moderator
Команда форума
Как вариант использовать sprintf
Код:
sprintf(currentTime, "%02d:%02d:%02d", hour(), minute(), second());
проблема такая же. Что произойдет если в момент вывода hour() до следующего часа останется меньше 1 мс? Выведется предыдущий час, а к моменту вывода минут и секунд счётчик уже тикнет на следующий и обнулит минуты и секунды. Вероятность небольшая, но есть. Потому лучше перед выводом завести константную переменную, которой присвоить millis() или time(nullptr), в зависимости что используется. И дальнейшие преобразования производить с константой, а не с функциями.
 

nikolz

Well-known member
проблема такая же. Что произойдет если в момент вывода hour() до следующего часа останется меньше 1 мс? Выведется предыдущий час, а к моменту вывода минут и секунд счётчик уже тикнет на следующий и обнулит минуты и секунды. Вероятность небольшая, но есть. Потому лучше перед выводом завести константную переменную, которой присвоить millis() или time(nullptr), в зависимости что используется. И дальнейшие преобразования производить с константой, а не с функциями.
надо сначала прочитать время в переменную, а потом ее преобразовывать.
 

Сергей_Ф

Moderator
Команда форума
надо сначала прочитать время в переменную, а потом ее преобразовывать.
а я что написал?
Потому лучше перед выводом завести константную переменную.... И дальнейшие преобразования производить с константой, а не с функциями.
 

CodeNameHawk

Moderator
Команда форума
Что произойдет если в момент вывода hour() до следующего часа останется меньше 1 мс? Выведется предыдущий час, а к моменту вывода минут и секунд счётчик уже тикнет на следующий и обнулит минуты и секунды. Вероятность небольшая, но есть.
Имхо часы минуты и секунды получаются в одной функции, так что ничего не произойдёт.
Это если функция "правильная".
 

CodeNameHawk

Moderator
Команда форума
Вряд ли кто додумается, каждую миллисекунду делать преобразования.
 

Сергей_Ф

Moderator
Команда форума
Имхо часы минуты и секунды получаются в одной функции, так что ничего не произойдёт.
Это если функция "правильная".
к сожалению функция ардуиновская
Код:
int hour() { // the hour now
  return hour(now());
}
и также для минут и секунд. Т.е. запрашивается каждый раз.
А для ошибки не требуется запрашивать каждую миллисекунду. Достаточно просто попасть в ненужный момент.
 

esp340

Active member
String print2digits(int number) {
String number1 = "";
if (number >= 0 && number < 10) number1 = '0' + String(number);
if (number >= 10) number1 = String(number);
return number1;
}

void loop() {
h = hour();
m = minute();
s = second();
Blynk.virtualWrite(V1, print2digits(h) + ':' + print2digits(m) + ':' + print2digits(s));

}
 

CodeNameHawk

Moderator
Команда форума
Вроде там что то есть типа:
Код:
int hour() { // the hour now
  return hour(now());
}

int hour(time_t t) { // the hour for the given time
  refreshCache(t);
  return tm.Hour; 
}

void refreshCache(time_t t) {
  if (t != cacheTime) {
    breakTime(t, tm);
    cacheTime = t;
  }
}

void breakTime(time_t timeInput, tmElements_t &tm){
// break the given time_t into time components
// this is a more compact version of the C library localtime function
// note that year is offset from 1970 !!!

  uint8_t year;
  uint8_t month, monthLength;
  uint32_t time;
  unsigned long days;

  time = (uint32_t)timeInput;
  tm.Second = time % 60;
  time /= 60; // now it is minutes
  tm.Minute = time % 60;
  time /= 60; // now it is hours
  tm.Hour = time % 24;
  time /= 24; // now it is days
  tm.Wday = ((time + 4) % 7) + 1;  // Sunday is day 1
 
  year = 0; 
  days = 0;
  while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) {
    year++;
  }
  tm.Year = year; // year is offset from 1970
 
  days -= LEAP_YEAR(year) ? 366 : 365;
  time  -= days; // now it is days in this year, starting at 0
 
  days=0;
  month=0;
  monthLength=0;
  for (month=0; month<12; month++) {
    if (month==1) { // february
      if (LEAP_YEAR(year)) {
        monthLength=29;
      } else {
        monthLength=28;
      }
    } else {
      monthLength = monthDays[month];
    }
    
    if (time >= monthLength) {
      time -= monthLength;
    } else {
        break;
    }
  }
  tm.Month = month + 1;  // jan is month 1 
  tm.Day = time + 1;     // day of month
}
 
Сверху Снизу