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