Easy way to convert a struct tm (expressed in UTC) to time_t type

前端 未结 9 930
臣服心动
臣服心动 2020-11-29 05:44

How do I do the above? There is mktime function but that treats the input as expressed in local time but how do i perform the conversion if my input tm variable happens to b

9条回答
  •  旧巷少年郎
    2020-11-29 06:26

    Here is a solution I use (Can't recall where I found it) when it isn't a windows platform

    time_t _mkgmtime(const struct tm *tm) 
    {
        // Month-to-day offset for non-leap-years.
        static const int month_day[12] =
        {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    
        // Most of the calculation is easy; leap years are the main difficulty.
        int month = tm->tm_mon % 12;
        int year = tm->tm_year + tm->tm_mon / 12;
        if (month < 0) {   // Negative values % 12 are still negative.
            month += 12;
            --year;
        }
    
        // This is the number of Februaries since 1900.
        const int year_for_leap = (month > 1) ? year + 1 : year;
    
        time_t rt = tm->tm_sec                             // Seconds
            + 60 * (tm->tm_min                          // Minute = 60 seconds
            + 60 * (tm->tm_hour                         // Hour = 60 minutes
            + 24 * (month_day[month] + tm->tm_mday - 1  // Day = 24 hours
            + 365 * (year - 70)                         // Year = 365 days
            + (year_for_leap - 69) / 4                  // Every 4 years is     leap...
            - (year_for_leap - 1) / 100                 // Except centuries...
            + (year_for_leap + 299) / 400)));           // Except 400s.
        return rt < 0 ? -1 : rt;
    }
    

提交回复
热议问题