Converting Between Local Times and GMT/UTC in C/C++

眉间皱痕 提交于 2019-11-26 10:50:25

问题


What\'s the best way to convert datetimes between local time and UTC in C/C++?

By \"datetime\", I mean some time representation that contains date and time-of-day. I\'ll be happy with time_t, struct tm, or any other representation that makes it possible.

My platform is Linux.

Here\'s the specific problem I\'m trying to solve: I get a pair of values containing a julian date and a number of seconds into the day. Those values are in GMT. I need to convert that to a local-timezone \"YYYYMMDDHHMMSS\" value. I know how to convert the julian date to Y-M-D, and obviously it is easy to convert seconds into HHMMSS. However, the tricky part is the timezone conversion. I\'m sure I can figure out a solution, but I\'d prefer to find a \"standard\" or \"well-known\" way rather than stumbling around.


A possibly related question is Get Daylight Saving Transition Dates For Time Zones in C


回答1:


You're supposed to use combinations of gmtime/localtime and timegm/mktime. That should give you the orthogonal tools to do conversions between struct tm and time_t.

For UTC/GMT:

time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);

For localtime:

t = mktime(&tm);
...
tmp = localtime(t);

All tzset() does is set the internal timezone variable from the TZ environment variable. I don't think this is supposed to be called more than once.

If you're trying to convert between timezones, you should modify the struct tm's tm_gmtoff.




回答2:


If on Windows, you don't have timegm() available to you:

struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs );  // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);

or something similar...




回答3:


If you need to worry about converting date/time with timezone rules, you might want to look into ICU.



来源:https://stackoverflow.com/questions/761791/converting-between-local-times-and-gmt-utc-in-c-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!