devo fare delle operazioni su delle date, ad esempio aggiungere l'ora legale, quindi bisogna contemplare tutto il calendario, tenere conto dei giorni di ogni mese, degli anni bisestili e delle date in cui avviene il cambio ora da qui ai prossimi x anni. Sapete se c'è in giro qualcosa di pronto in basic, C, qualunque cosa tanto per capire il meccanismo ? Grazie Marco
Se è solo per capire il meccanismo, è molto semplice: gli anni divisibili per 4 sono bisestili, quelli divisibili per 100 non lo sono, quelli divisibili per 1000 lo sono.
L'ora legale viene introdotta tra le due e le tre della prima domenica dopo l'equinozio primaverile (22 Marzo) e tolta dopo l'equinozio autunnale. Anzi, no, ora è cambiato, dopo il 23 Ottobre.
"F. Bertolazzi" ha scritto nel messaggio news: snipped-for-privacy@40tude.net...
quinti intendi: la prima domenica dopo il 22 Marzo (se casca di domenica è il 22 o il 29 ?) e la prima domenica dopo il 23 Ottobre (stesso dubbio di cui sopra)
Ma partendo da una data x, es "04/04/2009 12:57:08" io che ne so che giorno della settimana è ?
Ciao sono dell' idea che se si parte da codice gia' fatto da qualcuno, e si ha voglia di imparare questa rappresenti la migliore delle condizioni.
Ti posto codice funzionante dove puoi vedere come viene trattato il calcolo dell' anno bisestile e la banalita' del calcolo mese, il codice non e' mio ed e' scritto con il compilatore per pic della CCS
//////////////////////////////////////////////////////////////////////////////// // Test whether a given year is a leap year. // This optimized version only works for the period 2001 - 2099 //////////////////////////////////////////////////////////////////////////////// #define IS_LEAP(year) (year%4 == 0)
//////////////////////////////////////////////////////////////////////////////// // Initialize RTC //////////////////////////////////////////////////////////////////////////////// void Initialize_RTC(void) { Ticker = TIMER1_FREQUENCY; // initialize clock counter to number of clocks per second setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 ); // initialize 16-bit Timer1 to interrupt // exactly every 65536 clock cycles // (about 76 times per second) enable_interrupts( INT_TIMER1 ); // Start RTC }
//////////////////////////////////////////////////////////////////////////////// // -=Process Zero Drift Real Time Clock Information=- // // Most algorithms configure the timer to generate an interrupt every 100ms, and // then count the number of interrupts. The problem in that approach is that most // clock frequencies can't be divided by 256 and you don't get an exact
100ms. // The small errors will add up to an error of several seconds a day. // // The algorithm presented here is exact in the long run because it doesn't // count the number of interrupts but counts the number of clock cycles. //////////////////////////////////////////////////////////////////////////////// #int_TIMER1 void TIMER1_isr() { Ticker -= 65536; // Decrement ticker by clocks per interrupt if ( Ticker < 65536 ) // If second has expired { Ticker += TIMER1_FREQUENCY; // Increment ticker by clocks per second seconds++; // Increment number of seconds }
Interessante, anche se sarebbe molto semplice fare in altro modo, in fase di impostazione si dice che lunedi'=1 martedi=2 ecc.. allo scadere delle 24.00 un contatore viene incrementato, all'arrivo del 7 che corrisponde alla domenica il ciclo si ripete partendo da 1.
E se va via l'alimentazione?... Comunque il metodo che ho sempre usato è una semplice funzioncina con l'algoritmo di Zeller, tipo questo esempio preso da Google code:
formatting link
mentre per capire se è un' anno è bisestile o no basta 1 riga di codice:
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.