Boost logo

Boost Users :

From: Erik Thiele (erik_at_[hidden])
Date: 2003-10-29 03:34:55


On Tue, 28 Oct 2003 15:47:31 -0700
"Jeff Garland" <jeff_at_[hidden]> wrote:

> On Mon, 27 Oct 2003 14:36:57 +0100, Erik Thiele wrote
> > hi.
> >
> > i am trying to convert between UTC and CEST/CET (Europe/Berlin)
> >
> > i don't find documentation or suitable functions in the Wiki, the
> > examples or the documentation.
>
> Eric -
>
> The local time conversion code is still experimental which is why it
> is undocumented.

i see :-)

i now use c_local_adjustor, and rewrote my code. it now always uses utc
and converts only in one direction. utc->local. which is what the
c_local_adjustor can do.

> As I said, this is experimental code and I think this approach has
> proven to be rather cumbersome. I'm working on a 'dynamic timezone'
> class that will provide the ability to construct zone and offset data
> at runtime instead of using traits for timezone configurations. This
> won't be in the 1.31 release, however...

something like:

ptime a,b,c,d;
timezone_converter zc ("CET"); // calls setzone("CET");

timezone_converter_result_t result;
zc.local_to_utc(a, b, result); // converts "CET" a to utc b. function return value is "void"

// result is enum "unique", "undefined", "double_possibilities", choose
// better words of course :)

i.e. the hour that does not exist results in b unchanged, but
result==undefined.

the hour that exists twice results in b being the defaulting one of the two (see below) and result==double_possibilities

a normal time does result==unique.

zc.setzone("Europe/Berlin");

the returned value in the conversion routine when there are double_possibilities should be determined by the set timezone as follows:
zc.setzone("CET"); // return the utc corresponding to the given local time in winter time
zc.setzone("CEST"); // return the utc corresponding to the given local time in summer time
but of course in both cases result==double_possibilities.

then of course one could also have shortcuts like:

ptime local_to_utc(const ptime local); // throws exception if "undefined", returns default if "double_possibilities"

********

the utc_to_local function is quite interesting:

void time_converter::utc_to_local(ptime &utc, ptime &localtime, time_zone &adjzone);

see, even though the time_converter has a setzone("CET"); still the adjzone is returned.
this i think could be interesting because:

zc.setzone("CET"); // there is implicit conversion char* -> time_zone
zc.setzone("CEST"); // we only use utc_to_local, so this has the same effect than "CET".
timezone myzone;
zc.utc_to_local(a, b, myzone);
if (myzone == timezone("CET")) cout << "hey it's winter\n";
else if (myzone == timezone("CEST")) cout << "hey, it's summer\n";
else fatal("internal impossibility");

if (myzone.timekind()==time_zone::SUMMERTIME)
if (myzone.timekind()==time_zone::WINTERTIME)
if (myzone.timekind()==time_zone::HIGHSUMMERTIME) // stupid rules ...
if (myzone.timekind()==time_zone::NORMALTIME) // there exists no summer,winter,etc.

******

timezone baba ("CET");
timezone lulu ("Europe/Berlin"); // defaults to default-time, i.e. winter time
timezone kuku ("CEST");
assert (baba==lulu);
assert (lulu != kuku);

******

there are major design questions in timezone stuff.
for example, is CET == CEST.. as you see above i decided they are not equal.

maybe my ideas are of help.

cu & keep up good work
erik

-- 
Erik Thiele

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