time_t time(
time_t *t
);
返回从1970.1.1到指定时间 t 的秒数
time_t 为64位长整型,即__int64
VC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与0~18446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。
1、localtime —— 平台通用,多线程下不安全
struct tm *localtime(
const time_t *clock
);
这个函数在返回的时候,返回的是一个指针,实际的内存是localtime内部通过static申请的静态内存,所以通过localtime调用后的返回值不及时使用的话,很有可能被其他线程localtime调用所覆盖掉。
2、localtime_r —— Linux平台,安全函数
多线程应用里面,应该用localtime_r函数替代localtime函数,因为localtime_r是线程安全的,但是localtime_r只能运行于Linux平台。
struct tm* localtime_r(
const time_t* timer,
struct tm* result
);
3、localtime_s —— Windows平台,安全函数
localtime_s也是用来获取系统时间,运行于windows平台下,与localtime_r只有参数顺序不一样.
errno_t localtime_s(
struct tm* _tm,
const time_t *time
);
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
time_t timeSec=time(NULL);
struct tm* ptm=localtime(&timeSec);
sprintf("%02d:%02d:%02d",ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
time_t timeSec=time(NULL);
struct tm ptm={ 0 };
localtime_r(&timeSec, &ptm);
sprintf("%02d:%02d:%02d", ptm.tm_hour, ptm.tm_min, ptm.tm_sec);
time_t timeSec = time(NULL);
struct tm ptm;
localtime_s(&ptm, &timeSec);
printf("%d:%d:%d", ptm.tm_hour, ptm.tm_min, ptm.tm_sec);
注意,不能写成如下格式!!!
time_t timeSec = time(NULL);
struct tm *ptm = NULL;
localtime_s(ptm, &timeSec);
printf("%d:%d:%d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
否则程序会崩溃并抛出异常:
原因是系统不允许空指针作为参数去调用标准库函数!!