为什么 mktime 取消设置 gmtoff ?如何让 mktime 使用 gmtoff 字段?

Why is mktime unsetting gmtoff ? How to make mktime use the gmtoff field?

我想从 string 中获取一个 unix 时间戳,其中包含 YYYYMMDDThhmmss+TZ.

形式的时间表示

为此,我将字符串转换为 struct tm,然后使用 mktime 将其转换为 unix 时间戳。

str = "20150228T202832+02";
struct tm time_struct = {0};
strptime(str,"%Y%m%dT%H%M%S%z", &time_struct);
uint64_t timestamp = mktime(&time_struct); /* ignore and unset TZ */

当我使用与我所在的时区不同的时区时,就会出现问题。mktime 函数会忽略 unset tm_gmtoff struct tm 的字段,返回错误的时间戳(差异是 string 的时区减去我的时区)。

要纠正此行为,我想在调用 [=] 之前将我的时区与 string 的时区之间的差异添加到 struct tm 的字段中14=].

这是一个代码片段,可以解决我的问题。诀窍是使用全局变量 timezone.

/*
    Function: timestamp_from_datetime
    Returns the timestamp corresponding to a formated string YYYYMMDDTHHMMSS+TZ

    Parameters:
        datetime - must be non-NULL

    Returns:
        The timestamp associated to datetime
 */
time_t timestamp_from_datetime(const char *datetime)
{
    struct tm time_struct = (struct tm) {0};
    strptime(datetime,"%Y%m%dT%H%M%S%z", &time_struct);
    long int gmtoff = time_struct.tm_gmtoff;
    return mktime(&time_struct) - gmtoff - timezone;
}