函数strptime()
不可理解的行为:
#define _XOPEN_SOURCE #include <stdio.h> #include <time.h> double getPeriod(char * dateStart, char * dateStop) { struct tm tmStart, tmStop; time_t timeStampStart, timeStampStop; strptime(dateStart, "%Y-%m-%d %H:%M:%S", &tmStart); strptime(dateStop, "%Y-%m-%d %H:%M:%S", &tmStop); timeStampStart = mktime(&tmStart); timeStampStop = mktime(&tmStop); printf("%d\t%d\n", tmStart.tm_hour, tmStop.tm_hour); } int main() { getPeriod("2016-12-05 18:14:35", "2016-12-05 18:18:34"); return 0; }
输出:
17 18
为什么会发生?
编译器gcc(GCC)6.2.1 OS Linux
tmStart
和tmStop
没有初始化,所以有些字段在传递给mktime
时候会被初始化。 因此,行为在技术上是不确定的。
从strptime
手册页(注意前两句):
原则上,这个函数不会初始化tm,但只存储指定的值。 这意味着应该在调用之前初始化
tm
。 不同UNIX系统之间的细节有所不同。glibc
实现不会触及那些没有明确指定的字段,除非它重新计算tm_wday
和tm_yday
字段,如果任何年份,月份或日期元素更改。