Search code examples
c++clinuxutcdst

Distance UTC - LocalTime on Linux


I am writing a Linux (Ubuntu and Debian Lenny) application in C++.

Now I need to know the distance/offset between UTC and the currently set system time at a given day in the past. Since I need to convert recorded data, I the distance need to be calculated with respect to a date in the past (which may have a different DST setting than the current day).

Anyone know how to do this?

Edit: Reading the first answer I think I was misunderstood: I do not want to compare dates/times. I have date/time values which I want to convert from UTC to local time.


Solution

  • Prepare the tm structure with date:

    struct tm date;
    memset(&date,0,sizeof(date));
    date.tm_year = year - 1900;
    date.tm_mon = month - 1;
    date.tm_mday = day;
    date.tm_hour = hour;
    date.tm_min = minute;
    date.tm_sec = second;
    date.tm_isdst = -1; // VERY IMPORTANT
    
    mktime(&date); /// fill rest of fields
    

    And then take a look on tm_gmtoff

    printf("%d\n",date.tm_gmtoff);
    

    This is distance from UTC.

    Now this is Linux and BSD specific, it would not work on other stystems, and this works with respect to DST.

    Read man mktime for more information. And filling struct tm with correct values

    P.S.: Converting from UTC to Local and back?

    time_t posix_time = timegm(&UTC_Filled_struct_tm); // Linux specific line
    localtime_r(&posix_time,&local_Filled_struct_tm);
    

    Local to UTC

    time_t posix_time = mktime(&local_Filled_struct_tm);
    gmtime_r(&posix_time,&UTC_Filled_struct_tm);