Home > Mobile >  Convert tm of another timezone into tm of the GMT timezone
Convert tm of another timezone into tm of the GMT timezone

Time:12-24

I'm using chrono and c 20.

I have a tm struct for EST timezone, but can't figure out how to obtain the corresponding time in the GMT zone.

Here is what I've been thinking:

tm timeInAmerica = {0};
timeInAmerica.tm_year = 75;//1975
timeInAmerica.tm_month = 0;//January
timeInAmerica.tm_mday = 31;
timeInAmerica.tm_hour = 23;
timeInAmerica.tm_minute = 23;
timeInAmerica.tm_second = 23;

auto timeZone = std::chrono::locate_zone("America/New_York");
auto sysTime = timeZone->to_sys( /*needs local_time */ );

...I don't know how to convert that tm into local_time so that I can feed it into to_sys().

I also can't figure out how to convert the returned sysTime value back into tm (which will allow me to inspect the GMT year, month, day, hour, minute).

CodePudding user response:

using namespace std::chrono;

tm timeInAmerica = {0};
timeInAmerica.tm_year = 75;//1975
timeInAmerica.tm_mon = 0;//January
timeInAmerica.tm_mday = 31;
timeInAmerica.tm_hour = 23;
timeInAmerica.tm_min = 23;
timeInAmerica.tm_sec = 23;

auto lt = local_days{year{timeInAmerica.tm_year 1900}
                    /month(timeInAmerica.tm_mon 1)
                    /timeInAmerica.tm_mday}
            hours{timeInAmerica.tm_hour}
            minutes{timeInAmerica.tm_min}
            seconds{timeInAmerica.tm_sec};

auto timeZone = locate_zone("America/New_York");
auto sysTime = timeZone->to_sys(lt);

auto sysDay = floor<days>(sysTime);
year_month_day ymd = sysDay;
hh_mm_ss hms{sysTime - sysDay};

int y = int{ymd.year()};
int m = unsigned{ymd.month()};
int d = unsigned{ymd.day()};
int h = hms.hours().count();
int M = hms.minutes().count();
int s = hms.seconds().count();

I've issued a using namespace std::chrono just to keep the verbosity down to a low roar. If you would prefer to put std::chrono:: in all the right places, that's fine too.

lt is the local_time<seconds> (or just local_seconds) needed to represent the local time. Careful on the biases (1900 and 1) when converting from a tm.

To convert sysTime back into a {year, month, day, hour, minute, second} structure, first truncate sysTime to a days-precision time_point. Then that days-precision time_point can be converted to a {year, month, day} data structure.

The time of day is simply the date_time minus the date. This can be converted into an {hours, minutes, seconds} data structure: hh_mm_ss.

Both year_month_day and hh_mm_ss have getters to get the strongly typed fields. And then each strongly typed field has conversions to integral as shown above. When converting back to a tm, don't forget about the biases (1900 and 1).

  • Related