Converting string containing localtime into UTC in C

前端 未结 3 1886
长发绾君心
长发绾君心 2021-01-13 09:12

I have a string containing a local date/time and I need to convert it to a time_t value (in UTC) - I\'ve been trying this:

char* date = \"2009/09/01/00\";
st         


        
3条回答
  •  栀梦
    栀梦 (楼主)
    2021-01-13 09:58

    You can use mktime to interpret a struct tm in the local timezone. When you do so, be careful to set the tm_isdst flag. It's 0 for summertime, 1 for wintertime, and to -1 to have mktime figure it out. Here's some example code:

    void main()
    {
        char* date = "2009/09/01/00";
        struct tm cal = {};
        // Read string into struct tm
        strptime(date, "%Y/%m/%d/%H", &cal);
        // Tell mktime to figure out the daylight saving time
        cal.tm_isdst = -1;
        printf("%20s: %s", "Before mktime", asctime(&cal));
        // Convert struct tm to time_t
        time_t t = mktime(&cal);
        // Convert time_t to localtime
        struct tm localcal = *localtime(&t);
        printf("%20s: %s", "Local time", asctime(&localcal));
        printf("%20s: %i\n", "Local DST", localcal.tm_isdst);
        // Convert time_t to GMT
        struct tm gmcal = *gmtime(&t);
        printf("%20s: %s", "GM time", asctime(&gmcal));
        printf("%20s: %i\n", "GM DST", gmcal.tm_isdst);
    }
    

    This prints (I live in GMT+1, and it's wintertime now):

       Before mktime: Tue Sep  1 00:00:00 2009
          Local time: Tue Sep  1 00:00:00 2009
           Local DST: 1
             GM time: Mon Aug 31 22:00:00 2009
              GM DST: 0
    

    It looks like mktime converts a date in September based on the current daylight savings time. It's November now, so it's actually one hour off. I haven't found a way to correct that.

提交回复
热议问题