This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to set timezone for localtime()


Il 05/04/2018 18:26, Brian Inglis ha scritto:

Now I have another similar question. I have to convert a struct tm in UTC to
time_t, but I set TZ to Italy timezone. Is there a function that makes this
convertion without checking current timezone configured in TZ?
As mktime(3) assumes local time, and there are no currently supported context or
locale variants (GNU timegm(3), BSD/tzcode mktime_z(3)), after the previous
code, you should use:

	putenv("TZ=UTC0");
	tzset();
	struct tm stm_utc;
	stm_utc.tm_year		= year - 1900;
	stm_utc.tm_month	= month - 1;
	stm_utc.tm_mday		= day;
	stm_utc.tm_hour		= hour;
	stm_utc.tm_min		= min;
	stm_utc.tm_sec		= sec;
	stm_utc.tm_isdst	= 0;
	time_t tt_utc = mktime(&stm_utc);


As you can read in my previous posts, putenv() calls setenv() that allocates a new string every time (if the new value is longer than the old value). My application needs to call mktime() with "TZ=UTC0" and localtime() with "TZ=CET..." regularly and I can't call continuously setenv()/unsetenv(), because of a memory leak (unsetenv() doesn't call free).

Another unpleasent thing happens with tzset() (that I *need* to call every time I change "TZ" variable). tzset() allocates and save the previous value of "TZ" variable. Every time it checks if the value is different. If yes, it free() and malloc() the new value (and make all the timezone calculations). In this case there isn't any memory leak, however I'm indirectly and continuously calling malloc()/free().



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]