Newsgroup: it.comp.lang.visual-basic
Titolo: DateDiff piena zeppa di bug !

La funzione DateDiff di VB è piena zeppa di bug, tanto che occorre usarla
con cautela.
Se viene usata per contare i giorni da una data all'altra (senza tenere
conto di ore e minuti) il risultato è corretto.
Se invece viene usata per contare anni o mesi allora è meglio non usarla o
usarla correggendo gli errori che fa.
Infatti se voi fate
DateDiff ("yyyy", vostra data di nascita, oggi)
VB vi affibbierà un anno in più del dovuto.
Ma anche se fate ad es. DateDiff("m", "30 gen 2000", "1 feb 2000") verrà
fuori 1 mese, anche se è passato un solo giorno.
Ho cercato nell'Excel 97 per vedere se lo stesso codice buggato è presente,
ma non ho trovato la funzione che calcola anni e mesi tra due date, ma conta
solo i giorni !
Quindi ho scritto questo codice "a prova di bug" !!!
Sarà un pò rozzo o inelegante, ma è esente da errori !
Dim Date1 As Date, Date2 As Date
Date1 = CDate(Text3.Text): Date2 = CDate(Text4.Text)
If Date1 > Date2 Then Date3 = Date1: Date1 = Date2: Date2 = Date3 'scambia
le date se sono invertite
dtg = DateDiff("d", Date1, Date2): dta = Year(Date2) - Year(Date1)
If Month(Date1) = Month(Date2) And Day(Date1) = Day(Date2) Then GoTo Stampa
If Year(Date2) > Year(Date1) Then dta = Int(dtg / 365)
Date2 = DateAdd("yyyy", -dta, Date2): dtm = DateDiff("m", Date1, Date2)
If Day(Date2) = Day(Date1) Then GoTo Stampa
If Day(Date2) < Day(Date1) Then dtm = dtm - 1
Date2 = DateAdd("m", -dtm, Date2): dtf = DateDiff("d", Date1, Date2)
Stampa
dta sono gli anni, dtm i mesi e dtf i giorni
Bye

 fuori 1 mese, anche se è passato un solo giorno.
Il problema (a quanto pare) è che se usi "yyyy" VB tiene in considerazione
solo l'anno, e fa la differenza (corretta) tra i due anni, e non tra le due
date!
It's not a bug, it's a feature!
Il tuo secondo esempio fa lo stesso con i mesi, e non con i giorni!
Scherzi a parte, non uso mai queste funzioni (perchè fare una chiamata a
funzione quando posso usare direttamente gli operatori aritmetici?).
Giorni = CLng(Data1 - Data2)
Per i mesi è un po' più complesso, ma usare le date in formato nativo, senza
passare da funzioni che devono interpretare cio' che gli viene passato (per
passare "30 gen 2000" occorre prima fare una visita a Lourdes e chiedere il
miracolo perchè funzioni) è decisamente meglio.
Ciao

fuori 1 mese, anche se è passato un solo giorno.
Ma un mese... Da gennaio a febbraio e' in mesi un mese!! Mi sembra
logico... Se vuoi 30 giorni pari allora cerchi la diff in giorni!
-- 
<><><><><><><><><><><><><><>
<>   Ettore Gabrielli     <>
<> 
etto...@hotmail.com
   <>
<><><><><><><><><><><><><><>

 Ciao

 <><><><><><><><><><><><><><>

 fuori 1 mese, anche se è passato un solo giorno.
bah...per me è corretto che ritorni un mese, tu chiedi una cosa tipo:
differenza del parametro mese tra 30/01/2000 e 01/02/2000,   risultato
1....a me pare corretto
dalla guida di VB:
[Quando si esegue il confronto tra il 31 dicembre e l'1 gennaio dell'anno
immediatamente successivo, DateDiff utilizzata con l'impostazione dell'anno
("yyyy") restituisce 1 anche se è trascorso un solo giorno.]
mi sembra chiaro....
ciao

 E tu: ...un mese fa !
No, il senso e' "il mese scorso", ed e' corretto: siamo a febbraio, il
bambino e' nato a gennaio: secondo te sarebbe forse piu' corretto rispondere
"Questo mese"?
La differenza del termine "mese" tra 31-01-2001 e 01-02-2001 e' uno, come
puoi ben vedere ad occhio. Che poi a quel mese non corrispondano 31 giorni
effettivi è palese... Il problema e' che tu tendi a fare la differenza in
giorni, e poi dividere per 30: vb invece ti fornisce la differenza tra i
termini "giorni", "mesi", "anni" di una data.
Non te la prendere, ma se una funzione non si comporta come vuoi tu non per
questo e' bacata!!!
Ciao,
Luciano

 Luciano

io, basterebbe una sola riga.
Dovrebbe cioe' restituire una struttura, ma, da una parte,
sarebbe poco vb, dall' altra, potendo scegliere l' unita' di misura per 
il ritorno, si ha la possibilita' di usarla con il grado di precisione desiderato
Comunque, non ci vuole molto a farsi restituire il risultato in secondi,
all' interno di una propria funzione che trasformi il valore in un numero
complesso.
ciao, hal