Linux下用C语言设置和获取系统时间
一、Unix/Linux系统下有以下几种时间结构:
1、time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒;由函数time()获取;
2、struct timeb 结构:它有两个主要成员,一个是秒,另一个是毫秒;精确度:毫秒(10E-3秒);
3、struct
4、struct
5、clock_t 类型:由函数clock()获取;
6、struct
7、Unix对时间单位的定义:
8、时间格式化函数:
二、Unix/Linux系统下获取时间:
char* GetMacTime(int iLen)
{
static char MacTime[40];
long tt;
struct tm *vtm;
struct timeb mt;
static char wday_name[7][7] = {
"星期日", "星期一", "星期二", "星期三",
"星期四", "星期五", "星期六"
};
ftime(&mt);
time( &tt );
vtm = localtime( &tt );
switch (iLen) {
case 6: /* 时分秒 */
sprintf(MacTime,"%.2d%.2d%.2d",vtm->tm_hour,
vtm->tm_min,vtm->tm_sec);
break;
case 8: /* 年月日 */
sprintf(MacTime,"%.4d%.2d%.2d",(1900+vtm->tm_year),
vtm->tm_mon+1,vtm->tm_mday);
break;
case 108: /* 年月日 */
sprintf(MacTime,"%.4d年%.2d月%.2d日",(1900+vtm->tm_year),
vtm->tm_mon+1,vtm->tm_mday);
break;
case 9: /* 时分秒毫 */
sprintf(MacTime,"%.2d%.2d%.2d%.3d",vtm->tm_hour,
vtm->tm_min,vtm->tm_sec,mt.millitm);
break;
case 106: /* 时分秒 */
sprintf(MacTime,"%.2d时%.2d分%.2d秒",vtm->tm_hour,
vtm->tm_min,vtm->tm_sec);
break;
case 14: /* 年月日时分秒 */
sprintf(MacTime, "%.4d%.2d%.2d%.2d%.2d%.2d",
(1900+vtm->tm_year),vtm->tm_mon+1,
vtm->tm_mday, vtm->tm_hour,
vtm->tm_min, vtm->tm_sec);
break;
case 15: /* 年月日时分秒 */
sprintf(MacTime, "%.2d%.2d%.2d%.2d%.2d%.2d%.3d",
(vtm->;tm_year % 100),vtm->tm_mon+1,
vtm->tm_mday, vtm->tm_hour,
vtm->tm_min, vtm->tm_sec,mt.millitm);
break;
case 17: /* 年月日时分秒毫 */
sprintf(MacTime, "%.4d%.2d%.2d%.2d%.2d%.2d%.3d",
(1900+vtm->tm_year),vtm->tm_mon+1,
vtm->tm_mday, vtm->tm_hour,
vtm->tm_min, vtm->tm_sec,mt.millitm);
break;
default:
sprintf(MacTime, "%s %.4d年%.2d月%.2d日 %.2d:%.2d:%.2d",
wday_name[vtm->tm_wday],
(1900+vtm->tm_year),vtm->tm_mon+1,
vtm->tm_mday, vtm->tm_hour,
vtm->tm_min, vtm->tm_sec);
break;
}
return MacTime;
}
三、Unix/Linux系统下设置时间:
int settimeofday(const struct timeval *tv , const struct timezone *tz);
struct timeval {
time_t tv_sec; /* seconds since Jan. 1, 1970 */
suseconds_t tv_usec; /* 微妙 */
};
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};
tv表示需要设置的时间,tz表示时区。如果tv或tz某一项为NULL,表示对相关的信息不感兴趣。
如何把我们熟知的时间格式转换成tv->tv_sec:
利用结构体
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0 代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去 1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1 代表星期一,以此类推 */
int tm_yday; /* 从每年的1 月1 日开始的天数 – 取值区间为[0,365],其中0代表 1 月1日,1 代表1 月2日,以此类推 */
int tm_isdst;/* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst 为0;不了解情况时,tm_isdst()为负。*/
};
然后把mktime的返回值存入tv->tv_sec即可。再用settimeofday就可以设置时间了
<pre name="code" class="cpp">int setSystemTime(lua_State *L)
{
unsigned char arg1[MAXLEN] = {'\0'};
strcpy(arg1, luaL_checkstring(L, 1));
unsigned char *ptm = arg1;
time_t tt_sec;
struct tm tptr;
struct timeval tv;
tptr.tm_year = str_DToInt_D(ptm, 4) - 1900;
ptm += 4;
tptr.tm_mon = str_DToInt_D(ptm, 2) - 1;
ptm += 2;
tptr.tm_mday = str_DToInt_D(ptm, 2);
ptm += 2;
tptr.tm_hour = str_DToInt_D(ptm, 2);
ptm += 2;
tptr.tm_min = str_DToInt_D(ptm, 2);
ptm += 2;
tptr.tm_sec = str_DToInt_D(ptm, 2);
tv.tv_sec = mktime(&tptr);
tv.tv_usec = 0;
settimeofday(&tv, NULL);
return 0;
}
更多推荐
所有评论(0)