Libreria Time.h devuelve error de 1 dia en calculo de tiempo entre dos fechas

Estimados amigos del foro:

Espero no estar faltando a ninguna regla del foro al escribir un nuevo post.
El asunto es que borraron el post de donde me base titulado

"Se puede contar días con un DS3231 rtc?"

En este post incluian el siguiente codigo de ejemplo para calcular el tiempo entre dos fechas:

#include <Time.h>
time_t  T0, T1 ;         // Contenedores de fechas

void setup()
   {    Serial.begin(115200);  }

void loop()    {    
        // 01/02/2017
        T0 = SetFecha(2017,  2,   1,  12,  0,  0);  //01/02/2017 12:00:00
        printFecha(T0) ;
        T1 = SetFecha(2017,  3,  18, 12,  0,  0);  // 18/03/2017 12:00:00
        printFecha(T1) ;
        printFecha(T1 - T0);

        Serial.println("--------------------------------------------------");
        time_t H =  T1 - T0 ;

        Serial.print(String(year(H )- 1970)+" años,"  + String(month(H)-1 )+" meses,");
        Serial.println(String(day(H))+ " dias," + String(hour(H))+ " horas");
        Serial.println("---------------------------------------------------");
   }

void printFecha(time_t  t)
   {
       Serial.print(day(t)) ;    Serial.print(+ "/") ;   Serial.print(month(t));   Serial.print(+ "/") ;
       Serial.print(year(t));    Serial.print( " ") ;
       Serial.print(hour(t));   Serial.print(+ ":") ;   Serial.print(minute(t));   Serial.print(":") ;
       Serial.println(second(t));
       delay(1000);
   }

time_t SetFecha(int y, int m, int d, int h, int mi, int s  )
   {  tmElements_t Fecha ;
      Fecha.Second = s;
      Fecha.Minute = mi;
      Fecha.Hour = h;
      Fecha.Day = d ;
      Fecha.Month = m ;
      Fecha.Year = y -1970 ;
 
      return makeTime(Fecha);
   }

Usando la libreria Time.h

Ubicada en Time Library

Probe el codigo y funciona bien con las fechas y horas de inicio y de fin. Pero al probar con mas
fechas y horas me di cuenta que cuando la fecha inicial tiene el mismo mes que la fecha final el
resultado arroja una diferencia de 1 dia.

Ya trate de corregir el problema pero no encuentro la solucion.

Saludos cordiales, y espero sinceramente no estar faltando a las reglas del foro.

Ya busque en Internet sobre este error pero no encontre nada.

Moderador: Enlace editado

Estoy analizando el problema.

Creo que ya esta solucionado.

Mando el codigo corregido en solo un detalle:

#include <Time.h>
time_t  T0, T1 ;         // Contenedores de fechas

void setup()
   {    Serial.begin(115200);  }

void loop()    {    
        // 01/02/2017
        T0 = SetFecha(2017,  2,   1,  12,  0,  0);  //01/02/2017 12:00:00
        printFecha(T0) ;
        T1 = SetFecha(2017,  3,  18, 12,  0,  0);  // 18/03/2017 12:00:00
        printFecha(T1) ;
        printFecha(T1 - T0);

        Serial.println("--------------------------------------------------");
        time_t H =  T1 - T0 ;

        Serial.print(String(year(H )- 1970)+" años,"  + String(month(H)-1 )+" meses,");
        Serial.println(String(day(H)-1)+ " dias," + String(hour(H))+ " horas");
        Serial.println("---------------------------------------------------");
   }

void printFecha(time_t  t)
   {
       Serial.print(day(t)) ;    Serial.print(+ "/") ;   Serial.print(month(t));   Serial.print(+ "/") ;
       Serial.print(year(t));    Serial.print( " ") ;
       Serial.print(hour(t));   Serial.print(+ ":") ;   Serial.print(minute(t));   Serial.print(":") ;
       Serial.println(second(t));
       delay(1000);
   }

time_t SetFecha(int y, int m, int d, int h, int mi, int s  )
   {  tmElements_t Fecha ;
      Fecha.Second = s;
      Fecha.Minute = mi;
      Fecha.Hour = h;
      Fecha.Day = d ;
      Fecha.Month = m ;
      Fecha.Year = y -1970 ;
 
      return makeTime(Fecha);
   }

La linea con el codigo

Serial.println(String(day(H)-1)+ " dias," + String(hour(H))+ " horas");

tiene ahora Stringday(H)-1 que en el código original no esta.

Espero hacer muchas pruebas antes de confirmar que esta listo.

Saludos a todos

Yo lo que puede constatar que el error persiste cuando cambias mes tmb.
La diferencia de dias esta corrido en 1.
La diferencia de meses está también corrida en 1.

Gracias por verificarlo. Pensaba que tal vez tenia algo mal por acá.

Confirmado el problema. La solución que puse del day(H)-1 parece funcionar.

Saludos

La manera de probar que tengo el codigo corregido es como sigue:

Introduzco nuevas fechas y realizo el calculo con arduino.

Posteriomente entro a la pagina

Calculo de Tiempo entre dos fechas ONLINE.

y comparo ambos resultados.

He probado ya por dos dias con muchas fechas y parece estar bien.

Saludos