CTimeSpan??? (Seems March has 30 days...)
-
venerdì 10 febbraio 2012 14:52
May be I've found a bug in the CTimeSpan computing, unless March has 30 days ;)
I'm trying to compute the number of days between two days, and I used the following code:
CTime from(2012, 03, 01, 0, 0, 0); CTime to(2012, 03, 31, 0, 0, 0); CTimeSpan diff = to - from; int totDays = diff.GetDays() + 1;
In this case (from 2012/03/01 to 2012/03/31), I've got 30 days (the +1 is used to count even the start date )
This happens only if the "to" date is 03/31. E.g. if I compute 2012/03/31 - 2012/02/01 + 1 I got 59 (instead of 60: 29 february plus 31 march)
This doesn't happen if the "to" date is a different date or if march is not completely included in the diff computing:
2012/03/20 - 2012/02/01 + 1 gives me 49 and it's correct (29 february + 20 march)
The problem happens even in non leap years (e.g. 2011).
I'm using Visual Studio Professional 2010 v10.0.40219.1.
I tried the compiled exe on three different machines with the same results.
THAT'S STRANGE... OR NOT?
Following a screenshot of VS2010 in debug session, with the watch setted on the compute result...
- Modificato Danilo Di Bartolomei venerdì 10 febbraio 2012 15:46
Tutte le risposte
-
venerdì 10 febbraio 2012 15:05
Scusate non avevo notato che ero sul forum italiano...
traduco (se dovesse servire):
Forse ho trovato un bug nel calcolo del CTimeSpan, a meno che Marzo non abbia 30 giorni ;)
Sto provando a calcolare il numero di giorni compreso tra due date, ed ho usato il seguente codice:
CTime from(2012, 03, 01, 0, 0, 0); CTime to(2012, 03, 31, 0, 0, 0); CTimeSpan diff = to - from; int totDays = diff.GetDays() + 1;
In questo caso (dal 2012/03/01 al 2012/03/31), ho ottenuto 30 giorni (+1 serve a contare anche gli estremi )
Questo succede solo se la data "to" è il 31 Marzo. Es. se calcolo 2012/03/31 - 2012/02/01 + 1 ottengo 59 (invece di 60: 29 febbraio + 31 marzo)
Questo non succede se la data "to" è una data differente o se Marzo non è completamente incluso nella differenza:
2012/03/20 - 2012/02/01 + 1 mi da 49 ed è corretto (29 febbraio + 20 marzo)
Il problema capita anche in anni non bisestili (es. 2011).
Sto usando Visual Studio Professional 2010 v10.0.40219.1.
Ho provato l'eseguibile su tre differenti macchine con gli stessi risultati.
E' STRANO... O NO?
Nel testo in inglese ho allegato uno screenshot di vs2010 in debug con il watch sul risultato della differenza...
-
venerdì 10 febbraio 2012 15:24
Credo che CTimeSpan funzioni bene, ed anzi tenga conto del passaggio da ora solare ad ora legale (che dovrebbe essere il 25 marzo 2012).
Prova a stampare l'intero intervallo di tempo, comprese le ore, prima e dopo tale data di passaggio:
// cl /EHsc /W4 /nologo test.cpp #define UNICODE #define _UNICODE #include <atltime.h> #include <atlstr.h> #include <iostream> using namespace std; int wmain() { CTime from(2012, 03, 01, 0, 0, 0); CTime to1 (2012, 03, 24, 0, 0, 0); CTimeSpan diff1 = to1 - from; CTime to2 (2012, 03, 31, 0, 0, 0); CTimeSpan diff2 = to2 - from; wcout << diff1.Format(L"Diff1: Total days: %D, hours: %H, mins: %M, secs: %S").GetString() << endl; wcout << diff2.Format(L"Diff2: Total days: %D, hours: %H, mins: %M, secs: %S").GetString() << endl; return 0; }
L'output è:
Diff1: Total days: 23, hours: 00, mins: 00, secs: 00
Diff2: Total days: 29, hours: 23, mins: 00, secs: 00Come puoi notare, per il secondo intervallo manca un'ora, dovuta al passaggio da ora solare ad ora legale.
(Comunque, se pensi di aver trovato un bug, puoi usare il sito Microsoft Connect per segnalarlo; ma non penso che sia questo il caso.)
Giovanni
- Modificato Giovanni DicanioMVP venerdì 10 febbraio 2012 15:30
- Contrassegnato come risposta Danilo Di Bartolomei lunedì 13 febbraio 2012 13:29
- Contrassegno come risposta annullato Danilo Di Bartolomei lunedì 13 febbraio 2012 13:29
- Proposto come risposta Nicolò ZilioModerator venerdì 17 febbraio 2012 06:07
- Contrassegnato come risposta Nicolò ZilioModerator martedì 21 febbraio 2012 20:24
-
venerdì 10 febbraio 2012 15:40
Ciao Giovanni,
grazie per la risposta. All'ora legale non ci avevo proprio pensato...
Ma c'è un modo per non dover tenerne conto? A quanto ho capito il risultato di quell'operazione è dipendente dalla macchina su cui sto girando...
Danilo -
venerdì 10 febbraio 2012 15:45
Ciao Giovanni,
grazie per la risposta. All'ora legale non ci avevo proprio pensato...
Ma c'è un modo per non dover tenerne conto? A quanto ho capito il risultato di quell'operazione è dipendente dalla macchina su cui sto girando...
DaniloProva con COleDateTime e COleDateTimeSpan. Stando alla documentazione di COleDateTime, questa classe ignora l'ora legale.
Giovanni
-
venerdì 10 febbraio 2012 16:00Grazie mille
-
venerdì 10 febbraio 2012 16:01
Grazie mille
Prego. Di nulla.
Giovanni
- Modificato Giovanni DicanioMVP venerdì 10 febbraio 2012 16:01

