ziopippo:
idea di lasciarlo così com'è con il bug ed amen
Che significa essere reperibili H24 per l'amico quando un registro deciderà di fare un rollover... cosa che facilmente potrebbe capitare alla mezzanotte del 31 dicembre di uno qualsiasi dei prossimi anni
Mi chiedo quindi come faccio a limitare la regolazione della data in questi 15/20 anni?
Io prima mi chiederei come scrivere e rileggere con assoluta certezza i dati, poi penserei alla modifica.
zoomx:
A me sembra strano che la libreria ti richieda quel calcolo per l'anno.
Beh no, probabilmente la libreria (pensata per un universo che inizia con il primo del 1970 e termina con il capodanno del 2069) prevede di essere usata in un certo modo, ad esempio con un anno assoluto a 16 bit che convertirebbe "di nascosto" nella rappresentazione interna a 8 bit e nell'ulteriore rappresentazione nel registro dell'RTC.
Certo che se ci si mette a modificare direttamente la rappresentazione interna bisogna sapere esattamente come funziona (ok, qui è un ±1970, ma potrebbe essere qualsiasi cosa).
Patrick_M:
come più sopra , questo è nella timelib.h
Allora, io trovo questa timelib.h, e questa time.cpp.
Vedo che la funzione 'year' restituisce un int con l'anno assoluto, quindi da 1970 a 2069.
Non mi spiego le righe che ziopippo dice portano al risultato corretto:
tmpYear = year() - 1999;
tm.Year = tmpYear - 2018;
...perché non sappiamo ne quale valore assuma 'tmpYear' per un anno conosciuto, ne cosa è stato fisicamente scritto (e quindi riletto) nell'RTC, e inoltre con quelle sottrazioni e assegnamenti forse ci sono di mezzo dei rollover e troncamenti di bit (tmpYear è 8 o 16 bit? con segno o senza?).
Cioè, in apparenza dovrebbe essere semplicissimo, nel programma lavoro sempre e solo con un anno int (range 1970..2069) e lascio fare conversioni/scritture/letture alla lib, in pratica non ho capito che problema ci sia (anche perché quella lib non la so usare ).
Year ritorna un anno int 1970..2069
Vedo che setTime accetta sempre un anno int 1970..2069:
void setTime(int hr,int min,int sec,int dy, int mnth, int yr){
// year can be given as full four digit year or two digts (2010 or 10 for 2010);
//it is converted to years since 1970
if( yr > 99)
yr = yr - 1970;
else
yr += 30;
tm.Year = yr;
....
(EDIT: anche se mi sembra che nello spezzone di codice sopra ci sia un errore... 70+30 dovrebbe dare 0 e non 100)
Quindi non dovrebbe esserci alcun problema a lavorare sempre e solo con un anno int 1970..2069