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
calendario su PIC
Apr 01, 2009
12 Replies
marcick:
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:
O 400? Vabbè, poco importa. Per la probabile vita del tuo calendario, basta dividere per 4.
F. Bertolazzi ha scritto:
Gli anni secolari (quindi divisibili per 100) sono bisestili se divisibili per 400, non ho mai sentito la regola del 1000.
In altri termini, più facile:
((anno % 4 == 0 && anno % 100 != 0) || anno % 400 == 0)
(fonte: wikipedia)
Marco
"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 è ?
Mk
"marcick" ha scritto nel messaggio
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
int32 Ticker; int8 Seconds=0;
//optional: // int8 Year=0,Month=0,Days=0,Hours=0,Minutes=0;
//////////////////////////////////////////////////////////////////////////////// // 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 }/* --- Optional part start --- if(Seconds == 60) {Minutes++; Seconds=0; if(Minutes == 60) {Hours++; Minutes=0; if(Hours == 24) {Days++; Hours=0; if ( (Days == 29 && Month==2 && !IS_LEAP(Year)) || (Days == 30 && Month==2) || (Days == 31 && (Month==4 || Month==6 || Month==9 || Month==11 )) || (Days == 32) ) {Month++;Days=0;} if(Month == 13) {Year++; Month=0;} }}}
--- Optional part end --- */ }
po
Ultima domenica di marzo e ultima domenica di ottobre.
Ciao.
lucky
Mai sentito parlare di Zeller... ;-) Guarda quì:
formatting link
's_congruence
Ciao
"news.tin.it" ha scritto nel messaggio :
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.
"diego" ha scritto nel messaggio news:49d33f3c$0$691$ snipped-for-privacy@news.tiscali.it...
non ho un orologio che cammina, mi vengono semplicemente passate delle stringhe data/ora a caso e devo poterle aggiustare con l'ora legale Mk
"diego" ha scritto nel messaggio news:49d339ba$0$6837$ snipped-for-privacy@news.tiscali.it...
Ci studio sopra, grazie mille mk
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:
"isLeapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);"
isLeapYear è una variabile booleana, 0 se l'anno non è bisestile, 1 se è bisestile...
Come vedi è semplicissimo, ci va un attimo ad implementarlo.
Salvatore:
Oppure, per gli anni dal 1901 al 2099 compresi, isLeapYear = (year % 4) ? 0 : 1;
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required