• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
}
 
Сверху Снизу