Newsgroup: it.comp.lang.c
Titolo: mktime, baco del C (?)

Bounasera,
guardate un po' cosa ho scoperto (baco c).
La funzione restituisce il numero di secondi che intercorrono tra l'ora 
corrente e l'ora che si passa come parametro
void test( void )
{
char test[100];
time_t sec;
 sprintf( test, "2006-10-25 16:44:00" ); // test
 sec = DiffDate( test );
}
time_t DiffDate(char *data)
{
char sdata[9], sora[7];
long lora, ldata;
time_t tdata, t;
struct tm tm_data;
 sprintf(sdata, "%4.4s%2.2s%2.2s", data, data+5, data+8);
 ldata = atol(sdata);
 sprintf(sora , "%2.2s%2.2s%2.2s", data+11, data+14, data+17);
 lora = atol(sora);
 memset(&tm_data, 0, sizeof(tm_data));
 tm_data.tm_year = (int) (ldata / 10000) - 1900 ;
 tm_data.tm_mon  = (int) ((ldata % 10000) / 100) -1;
 tm_data.tm_mday = (int) (ldata % 100);
 tm_data.tm_hour = lora/10000;
 tm_data.tm_min  = (lora%10000)/100;
 tm_data.tm_sec  = lora%100;
/* INSERIRE QUI */
tdata = mktime(&tm_data);
time(&t);
 return t-tdata; //differenza in secondi
}
la funzione mktime funziona a seconda dell'ora del PC !
Se però si imposta questo flag prina nel punto contrassegnato dal commento, 
ovvero
tm_data.tm_isdst = -1;
allora mktime restituisce la funzione corretta.
Quel che mi chiedo ora è: devo SEMPRE impostare il flag tm_isdst a -1 ???
Grazie a chi vorrà rispondere, spero in una risposta stile Laforgia :-)
Ciao
Marco 

 Quel che mi chiedo ora č: devo SEMPRE impostare il flag tm_isdst a -1 ???
tm_idst č legato all'ora solare/legale. "idst" dovrebbe stare per "is
dayligth saving time".
Quando non trovi un risultato corretto (senza il -1), dovresti trovare un
errore di 3600 (= numero di secondi in un'ora).
Prova a cambiare l'ora del PC mettendo data/ora in modo che cadi nell'ora
solare (ora siamo ancora per poco nel periodo di ora legale) e se metti -1
non dovrebbe piů funzionare correttamente.
Dai un'occhiata qua per maggiori dettagli
http://lists.freebsd.org/pipermail/freebsd-standards/2003-November/000268.html
http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_280.htm
Scusa, ma adesso non ho tempo per approfondire.
Spero che ti sia sufficiente. Ciao
Marco

 Quel che mi chiedo ora è: devo SEMPRE impostare il flag tm_isdst a -1 ???
tm_isdst
     A flag that indicates whether daylight saving time is in effect at
     the time described.  The value is positive if daylight saving time
     is  in  effect, zero if it is not, and negative if the information
     is not available.
Dopo la memset() il suo valore dovrebbe essere zero quindi la mktime() 
si comporta di conseguenza.  IMO per avere un corretta risposta dovresti 
impostarla per come e` impostata nel sistema.
Altrimenti puo` andare bene ira, ma non quando il DST non e` piu` in 
effetto.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 effetto.
come faccio a conoscere il DST?
grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Spero che ti sia sufficiente. Ciao
ti ringrazio ma non riesco a trovare il modo per aggirare il problema.


eccoti la soluzione
time_t DiffDate( char *data )
{
char sdata[9], sora[7];
long lora, ldata;
time_t tdata, sec, system_time;
struct tm tm_data, *tdata_dst=NULL;
	sprintf( sdata, "%4.4s%2.2s%2.2s", data, data+5, data+8 );
	sprintf( sora, "%2.2s%2.2s%2.2s", data+11, data+14, data+17 );
	ldata = atol( sdata );
	lora = atol( sora );
	memset( &tm_data, 0, sizeof( tm_data ) );
	tm_data.tm_sec   = lora%100;
	tm_data.tm_min   = (lora%10000)/100;
	tm_data.tm_hour  = lora/10000;
        tm_data.tm_mday  = (int)(ldata%100);
	tm_data.tm_mon   = (int)((ldata%10000)/100)-1;
	tm_data.tm_year  = (int)(ldata/10000)-1900;
	tm_data.tm_isdst = -1;
	tdata = mktime( &tm_data );
 
	tdata_dst = localtime( &tdata );
	tdata = mktime( tdata_dst );
	time( &system_time );
	sec = system_time-tdata;
	return sec;
}
saluti!


 corrente e l'ora che si passa come parametro
ciao Marco,
*secondo me* cosě dovrebbe funzionare:
time_t DiffDate( char *data )
{
char sdata[9], sora[7];
long lora, ldata;
time_t tdata, sec, system_time;
struct tm tm_data, *tdata_dst=NULL;
	sprintf( sdata, "%4.4s%2.2s%2.2s", data, data+5, data+8 );
	sprintf( sora, "%2.2s%2.2s%2.2s", data+11, data+14, data+17 );
	ldata = atol( sdata );
	lora = atol( sora );
	memset( &tm_data, 0, sizeof( tm_data ) );
	tm_data.tm_sec   = lora%100;
	tm_data.tm_min   = (lora%10000)/100;
	tm_data.tm_hour  = lora/10000;
        tm_data.tm_mday  = (int)(ldata%100);
	tm_data.tm_mon   = (int)((ldata%10000)/100)-1;
	tm_data.tm_year  = (int)(ldata/10000)-1900;
	tm_data.tm_isdst = -1;
	tdata = mktime( &tm_data );
 
	tdata_dst = localtime( &tdata );
	tdata = mktime( tdata_dst );
	time( &system_time );
	sec = system_time-tdata;
	return sec;
}
-- 


 come faccio a conoscere il DST?
Dipende dal sistema operativo.  Forse puoi chiedere su NG adatto.


 	tdata = mktime( tdata_dst );
... a parte, probabilmente, l'aver normalizzato la struttura in 'tdata_dst'.
Dettagli?
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 Quel che mi chiedo ora č: devo SEMPRE impostare il flag tm_isdst a -1 ???
imho, se ti funziona non e' una cattiva scelta :) ma non so quanto possa 
essere portabile. E, comunque, se non ti interessa la portabilita', 
nella lib del tuo sistema ci saranno quasi sicuramente altre funzioni 
simili o complementari che potrebbero darti un aiuto in piu'.
