Verificare l’ora solare-legale in C

hello_worldVerificare che una data ricada o meno nel periodo dell’ora solare-legale è possibile grazie alla funzione di seguito riportata.

Scritta interamente in C si appoggia alla funzione “giornosettimana” descritta in questo post:

http://www.alfonsoprisco.com/wordpress/programmazione/il-giorno-della-settimana-in-c/

L’algoritmo è attualmente impostato con il periodo Marzo-Ottobre, nel senso che l’ultima domenica di marzo alle 2.00 am si passa all’ora legale e l’ultima domenica di ottobre alle 3.00 am a quella solare.

Di seguito riportiamo il codice sorgente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 * LegalTime
 * ---------
 * Questa funzione verifica se la data in parametri ricade nell'ora solare [S] o legale [L]
 *
 * PARAMETRI:   iYear = anno    (aaaa ex. 2008)
 *              iMont = mese    (m [1-12])
 *              iDay  = giorno  (g [1-31])
 *              iHour = ora     [h [0-24])
 *
 * RITORNO: S = SOLARE
 *          L = LEGALE
 *
 */


char LegalTime(int iYear, int iMonth, int iDay, int iHour)
{
       
    // La flag del cambio ora
    char cFlag = '\0';

    // Verifico in quale giorno della settimana mi trovo
    int iDayW = GiornoSettimana(iDay, iMonth, iYear);

    // Se sono ad ottobre
    if(iMonth == 10)
    {
        // Se è domenica
        if(iDayW == 0)
        {
            // Se è l'ultima domenica
            if((iDay + 7) > 31)
            {
                // Se l'ora è >= delle 3.00
                if(iHour >= 3)
                {
                    cFlag = 'S';
                }
            }

        }
        else
        {
            // Se non è domenica, ma l'ultima è già passata
            if((iDay + (7 - iDayW))> 31)
            {
                cFlag = 'S';
            }
            else
            {
                cFlag = 'L';
            }
       
        }
    }
    // Se sono a marzo
    else if(iMonth == 3)
    {
        // Se è domenica
        if(iDayW == 0)
        {
            // Se è l'ultima domenica
            if((iDay + 7) > 31)
            {
                // Se l'ora è >= delle 2.00
                if(iHour >= 2)
                {
                    cFlag = 'L';
                }
            }

        }
        else
        {
            // Se non è domenica, ma l'ultima è già passata
            if((iDay + (7 - iDayW))> 31)
            {
                cFlag = 'L';
            }
            else
            {
                cFlag = 'S';
                   
            }
        }
    }
    // Se sono nel periodo dell'ora legale
    else if(iMonth >= 4 && iMonth <= 9)
    {
        cFlag = 'L';
    }
    // Se sono nel periodo dell'ora solare
    else if((iMonth >= 1 && iMonth <= 2) || (iMonth >= 11 && iMonth <= 12))
    {
        cFlag = 'S';
    }

    return cFlag;
}

L’algoritmo si limita ad una serie di operazioni di confronto per determinare con esattezza matematica se il giorno ed il mese in cui cade il giorno di Pasqua corrispondenti all’anno scelto.

Il codice è semplicissimo da usare e non ha bisogno di ulteriori commenti data la sua chiarezza.
Potete eseguire il download del codice sorgente alla pagina solo codice raggiungibile a questo indirizzo:

http://www.alfonsoprisco.com/wordpress/codice-in-full-immersion/

Per qualsiasi domanda o commento scriveteci pure.

a presto

Share Button
Pin It

4commenti su “Verificare l’ora solare-legale in C

  1. Ciao, ci sono esempi di prg in C/C++ di grafica (es. disegno di un cerchio) per C4droid per GS2?
    Grazie,
    Ciao Antonio

    • Ciao Antonio,
      nel blog non ci sono esempi su grafica con c4droid, tuttavia se ricordo bene credo ci siano nell’applicazione.

      A presto

  2. Avrei un appunto da fare:
    per le ore 01 e 02 dell’ultima domenica di ottobre, ovvero quella del passaggio da ora legale estiva (DST) ad ora solare (STD), il programma non definisce il valore di cFlag che rimane quello dell’inizializzazione ”.
    Inoltre vorrei sapere come si definisce cFlag per l’ora 02 della suddetta domenica, che può essere sia L che S a seconda del fatto che si siano spostate indietro le lancette o meno…
    Invece il solito problema per marzo può essere corretto con l’aggiunta di un ‘else’.

    Grazie per mettere a disposizione codice sorgente per chi come me si diletta di programmazione.
    Thor.

    • Ciao e grazie per il commento,
      quel codice viene utilizzato per modificare e correggere eventualmente il passaggio dall’ora solare all’ora legale su dispositivi non dotati dell’apposita funzione di sistema operativo.
      Il valore di cFlag ad ogni controllo viene restituito e deve essere cura del programma chiamante memorizzarlo da qualche parte (es. in un file).
      Il valore così memorizzato viene semplicemente confrontato ad intervalli regolari (ogni ora, ogni giorno ecc.) con quello che restituisce la funzione ogni qual volta la si chiama, e se i due valori sono differenti, il sistema deve portare avanti o indietro l’orologio seguendo L o S.
      Faccio un esempio:
      ho avviato la macchina la prima volta e la funzione mi ha restituito L perchè sono a settembre ed ho regolato manualmente l’orologio con l’ora esatta, da questo momento ad ogni controllo la funzione mi restituirà sempre L fino alle 02:59 dell’ultima domenica di ottobre e quando l’orologio scatterà alle 3 la funzione mi restituirà S, quindi il programma chiamante facendo il confronto troverà che L è diversa da S e porterà le lancette di 1 ora indietro memorizzando S.
      Andando avanti la funzione mi restituirà S fino alle 01:59 dell’ultima domenica di Marzo quando dopo 1 minuto e quindi dalle 02:00 in poi mi restituirà L ed il sistema facendo il confronto troverà s diverso da L e riporterà le lancette avanti di 1 ora.
      Tutti gli altri confronti servono semplicemente per correggere la flag memorizzata se il sistema è stato spento per molto tempo.
      E’ possibile quindi adattare la funzione a seconda delle esigenze per far restituire cFag anche nel caso in cui l’ora sia precedente le 03:00 dell’ultima domenica di Ottobre, ma non era necessario per quello che a me serviva.

      Basterebbe infatti modificare così:
      // Se è l’ultima domenica
      if((iDay + 7) > 31)
      {
      // Se l’ora è >= delle 3.00
      if(iHour >= 3)
      {
      cFlag = ‘S’;
      }
      else
      cFlag = ‘L’; // aggiunta per le ore precedenti alle 03:00
      }

      stessa cosa per marzo:

      // Se è l’ultima domenica
      if((iDay + 7) > 31)
      {
      // Se l’ora è >= delle 2.00
      if(iHour >= 2)
      {
      cFlag = ‘L’;
      }
      else
      cFlag = ‘S’;
      }
      spero di essere stato di aiuto.

      a presto

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *