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).
