Boost logo

Boost Users :

Subject: Re: [Boost-users] Question on Posix timezone string
From: Mats Webjörn/WIKAB (konsult_at_[hidden])
Date: 2018-12-28 22:22:32


Or rather,

time_zone_ptr nyc = tz_db.time_zone_from_region("Europe/Berlin");
auto s = nyc->to_posix_string();

yields s = "CET+01CEST+01,M3.5.0/02:00,M10.5.0/03:00"

which if assigned to TZ will (in winter) make Berlin localtime 12:00:00 when UTC is 13:00:00 (which for obvious reasons is incorrect)

n Mats

Från: Boost-users [mailto:boost-users-bounces_at_[hidden]] För Mats Webjörn/WIKAB via Boost-users
Skickat: den 28 december 2018 22:30
Till: 'boost-users_at_[hidden]'
Kopia: Mats Webjörn/WIKAB
Ämne: Re: [Boost-users] Question on Posix timezone string

Hi Leon,

Yes, but the problem is that the offset for Berlin in Boost date_time_zonespec.csv is +01, not -01

n Mats

Från: Boost-users [mailto:boost-users-bounces_at_[hidden]] För Leon Mlakar via Boost-users
Skickat: den 28 december 2018 22:18
Till: boost-users_at_[hidden]
Kopia: Leon Mlakar
Ämne: Re: [Boost-users] Question on Posix timezone string

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