为什么 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
的时区减去我的时区)。
- 为什么
mktime
忽略 struct tm
的 tm_gmtoff
字段?
- 为什么
mktime
将 tm_gmtoff
字段设置为我当前的时区 而没有相应地修改 struct tm
的其余部分? (使 struct tm
代表不同的时间 !)
要纠正此行为,我想在调用 [=] 之前将我的时区与 string
的时区之间的差异添加到 struct tm
的字段中14=].
- 如何在不创建新的(无用的)
struct tm
的情况下获取当前时区?
这是一个代码片段,可以解决我的问题。诀窍是使用全局变量 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;
}
我想从 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
的时区减去我的时区)。
- 为什么
mktime
忽略struct tm
的tm_gmtoff
字段? - 为什么
mktime
将tm_gmtoff
字段设置为我当前的时区 而没有相应地修改struct tm
的其余部分? (使struct tm
代表不同的时间 !)
要纠正此行为,我想在调用 [=] 之前将我的时区与 string
的时区之间的差异添加到 struct tm
的字段中14=].
- 如何在不创建新的(无用的)
struct tm
的情况下获取当前时区?
这是一个代码片段,可以解决我的问题。诀窍是使用全局变量 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;
}