Boost logo

Boost Users :

Subject: Re: [Boost-users] Question on Posix timezone string
From: Leon Mlakar (leon_at_[hidden])
Date: 2018-12-28 21:18:06


On 28.12.2018 21:34, Mats Webjörn/WIKAB via Boost-users wrote:
>
> I’m using Boost 1.66 and use the following code to get a Posix string
> to set my uCLinux TZ environment variable to get a local time from an
> UTC time
>
> #include <boost/date_time/local_time/tz_database.hpp>
>
> #include <boost/date_time/local_time/local_time.hpp>
>
> tz_database tz_db;
>
> tz_db.load_from_file("./date_time_zonespec.csv");
>
> time_zone_ptr nyc = tz_db.time_zone_from_region("Europe/Stockholm");
>
> auto s = nyc->to_posix_string(); //
> "CET+01CEST+01,M3.5.0/02:00,M10.5.0/03:00"
>
> setenv("TZ", s.c_str(), 1);
>
> The odd thing is that my localtime becomes incorrect, and is actually
> 1 hr wrong on the opposite side of UTC.
>
> But, when I read
> https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html it
> says
>
> “The offset specifies the time value you must *_add to the local
> time_* to get a Coordinated Universal Time value”.
>
> Not add to UTC time, which seems like the Boost Posix string assumes
> !!!!!
>
> Which explains why 16:00 UTC give 15:00 CET instead of 17:00 which is
> the correct value, when using localtime_r().
>
I think this document is correct, and that POSIX systems actually add
the TZ offset to the displayed local time to yield UTC, unlike to ISO
8601 where offset is subtracted from the local time (or, change the sign
of the offset, then add :-) in the time string, to get the UTC .

Five minutes past noon on one winter day in Berlin would thus be
12:05:00 with TZ offset -01 on Posix system and 12:05:00+01 in ISO 8601
textual presentation.

Cheers,

Leon



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net