calendario su PIC

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

Reply to
marcick
Loading thread data ...

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.

Reply to
F. Bertolazzi

F. Bertolazzi:

O 400? Vabbè, poco importa. Per la probabile vita del tuo calendario, basta dividere per 4.

Reply to
F. Bertolazzi

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

Reply to
Marco Trapanese

"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

Reply to
marcick

"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 --- */ }

Reply to
diego

po

Ultima domenica di marzo e ultima domenica di ottobre.

Ciao.

lucky

Reply to
lucky

Mai sentito parlare di Zeller... ;-) Guarda quì:

formatting link
's_congruence

Ciao

Reply to
news.tin.it

"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.

Reply to
diego

"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

Reply to
marcick

"diego" ha scritto nel messaggio news:49d339ba$0$6837$ snipped-for-privacy@news.tiscali.it...

Ci studio sopra, grazie mille mk

Reply to
marcick

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.

Reply to
Salvatore

Salvatore:

Oppure, per gli anni dal 1901 al 2099 compresi, isLeapYear = (year % 4) ? 0 : 1;

Reply to
F. Bertolazzi

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.