How to set timezone for localtime()

Brian Inglis Brian.Inglis@SystematicSw.ab.ca
Thu Apr 5 16:26:00 GMT 2018


On 2018-04-05 04:44, Giuseppe Modugno wrote:
> Il 31/03/2018 08:45, Brian Inglis ha scritto:
>> On 2018-03-31 00:16, Giuseppe Modugno wrote:
>>> I have the number of seconds since epoch 1970, in UTC. I'd like to convert
>>> it into broken-down time (year, month, day, hours, ...). I live in Italy
>>> and I need the broken-down in *local* time, so taking into account timezone
>>> (+1 hour) *and* daylight savings.
>>>
>>> My platform is a Cortex-M3 MCU from NXP. I'm using MCUXpresso IDE to build
>>> my project and I'm using newlib-nano variant.
>>>
>>> I looked at the code and it seems there is some instructions in localtime()
>>> that take into account the timezone. However I don't know how to set
>>> Italian timezone on my platform (somewhere I read I can set TZ environment
>>> variable... but I don't have an environment at all).

>> Does your platform at least support putenv(3)?
>> If so, then on a hosted platform with the latest zoneinfo package, you can run:
>>
>>     $ tail -1 /usr/share/zoneinfo/Europe/Rome
>>     CET-1CEST,M3.5.0,M10.5.0/3
>>
>> which shows the encoded EU rules for that time zone: STD CET == UTC+1 with
>> opposite POSIX sign, DST CEST == UTC+2 from March last Sunday at 02.00, until
>> October last Sunday at 03.00.
>> In your program:
>>
>>     #include <stdlib.h>
>>     putenv("TZ=CET-1CEST,M3.5.0,M10.5.0/3");
>>     #include <time.h>
>>     tzset();
>>     time_t tt = time(&tt);
>>     struct tm *stmp = localtime(&tt);
>>
>> should give you the correct broken down time if tzset(3) and localtime(3)
>> support using TZ.

> 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);

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada



More information about the Newlib mailing list