Newsgroup: it.comp.programmare.win32
Titolo: Sapere se l'anno corrente è di 365 o 366 giorni

Come faccio a sapere se l' anno in corso è composto da 365 o 366 giorni
?
Ho dato un aocchiata alla struttura :
typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;
ma non mi viene in mente niente, inoltre come fareste voi, dato un
numero da 1 a 365 a sapere a che  giorno ed a che mese corrisponde nel
corso dell' anno ?
Il tutto utilizzando le API di windows...
Ringrazio tutti anticipatamente per eventuali  idee e consigli...
Dave.

Ciao, Dave!
Il giorno 09/12/2003 alle ore 17:33 hai scritto:
 D> Come faccio a sapere se l' anno in corso è composto da 365 o 366 giorni
Per sapere se un anno e' bisestile o meno:
int leap = ( !(year % 4) && (year % 100)) || !(year % 400);
 D> ma non mi viene in mente niente, inoltre come fareste voi, dato un
 D> numero da 1 a 365 a sapere a che  giorno ed a che mese corrisponde nel
 D> corso dell' anno ?
Comincerei a sottrarre i giorni presenti in ogni mese finche' il resto non
e' inferiore ai giorni presenti nel mese in esame.
 D> Il tutto utilizzando le API di windows...
Caspita una base elementare di matematica e un po' di inventiva non bastano
?
Bye

 Bye
Io ho sempre programmato in C su vecchi sitemi DOS, passando a WIN ho sempre
scritto da zero le varie funzioni accorgendomi poi che esisteva qualcosa di
simile già bello e pronto, allora adesso anzichè riscoprire l'acqua calda
preferisco chiedere se esistono soluzioni alternative a quelle che ho già
pensato approfittando per imparare qlc di nuovo ;-) ...
Grazie 1000 Ciao Dave.

Il tutto utilizzando le API di windows...
   E` bruttissimo, pero` la richiesta e` di utilizzare le API. Allora
potresti fare cosi`:
   1) imposti una struttura SYSTEMTIME al 1 gennaio dell'anno di
interesse, ora 0:00:00.0;
   2) la converti in un FILETIME con SystemTimeToFileTime;
   3) sommi alla struttura FILETIME (numero-1)*864000000000 <- numero
di decimi di microsecondo in un giorno (probabilmente viene meglio se
copi la struttura in un ULARGE_INTEGER;
   4) riconverti il tutto in un SYSTEM_TIME;
   5) se il giorno 60 e` il 29 febbraio, allora e` un anno bisestile.
   Qualcosa del genere:
------------------------------------------------------------
FILETIME ft;
SYSTEMTIME st;
ULARGE_INTEGER ui;
int giorno = 60;
st.wYear = 2003;
st.wMonth = 1;
st.wDay = 1;
st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
SystemTimeToFileTime(&st, &ft);
ui.LowPart = ft.dwLowDateTime;
ui.HighPart = ft.dwHighDateTime;
ui.QuadPart += (giorno - 1) * (((ULONGLONG) 86400) * 10000000);
ft.dwLowDateTime = ui.LowPart;
ft.dwHighDateTime = ui.HighPart;
FileTimeToSystemTime(&ft, &st);
------------------------------------------------------------
   Per abbruttirlo ancora, si potrebbe passare direttamente il
puntatore a ULARGE_INTEGER alle API, con un cast:
------------------------------------------------------------
SYSTEMTIME st;
ULARGE_INTEGER ui;
int giorno = 60;
st.wYear = 2003;
st.wMonth = 1;
st.wDay = 1;
st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
SystemTimeToFileTime(&st, (FILETIME *) &ui);
ui.QuadPart += (giorno - 1) * (((ULONGLONG) 86400) * 10000000);
FileTimeToSystemTime((FILETIME *)&ui, &st);
------------------------------------------------------------
Saluti.
-- 
S.L.

 [CUT]
Bruttissimo è un eufemismo... spero che il tuo esempio valga solo a fini 
"didattici"... ;) 
-- 
Luc

 corso dell' anno ?
Memorizzi in un vettore da 1 a 12 le somme parziali dei giorni:
v[1] = 31 // gen
v[2] = 59 (o 60 se bis.) // gen + feb
v[3] = 90 (o 91 se bis.) // gen + feb + mar
...
Dato, ad esempio, il numero 73, sai di essere al v[2] + 14, ovvero al 14
marzo.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

"didattici"... ;) 
   Be, chiaro. Diciamo che era un "esercizio" :) Pero`, a dire il
vero, non saprei come farlo altrimenti con le API.
-- 
S.L.

 corso dell' anno ?
Direi...
var a: TDateTime
      b: String
begin
    a := StrToDateTime ('31/12/1999') + NumGiorni;
    b := DateTimeToStr (a);
end;

 pianger d'amore:
Scusatemi tutti, sara' che ho un po' di febbre, ma ero convinto di essere
nel gruppo di Delphi.
Scusate ancora...

 bisestili.
Non c'era anche l'esclusione degli anni che siano inizio di millennio (vedi
il 2000)?
M.


Mi sono risposto da solo:
Non dovrebbero (è spigato nel link il condizionale) essere bisestili gli
anni divisibili per 4000.
http://www.tondering.dk/claus/cal/node3.html#SECTION00322000000000000000
M.

Dave ha scritto:


imho 1Sconosciuto ha ragione: anche se nn conosci la funzione IsLeapYear,
non sarebbe semplicissimo considerare un anno sicuramente bisestile (ad
es. il 2000) e partire da quello x fare un po' di calcoletti e vedere se
l'anno corrente è bisestile? :)
ciao


 anni divisibili per 4000.
Non c'è nessuna regola precisa, quella di cui parli è solo una proposta.



Si, appunto.
M.