Linux uses C to get the current time, specifically as follows:
Code (you can change the Clock_gettime to Time (NULL))
?
12345678910 |
void getNowTime()
{
timespec
time
;
clock_gettime(CLOCK_REALTIME, &
time
);
//获取相对于1970到现在的秒数
tm nowTime;
localtime_r(&
time
.tv_sec, &nowtime);
char current[1024];
sprintf
(current,
"%04d%02d%02d%02d:%02d:%02d"
, nowTime.tm_year + 1900, nowTime.tm_mon, nowTime.tm_mday,
nowTime.tm_hour, nowTime.tm_min, nowTime.tm_sec);
}
|
Analysis:
Clock_gettime ()
The function "Clock_gettime" is a time function based on the Linux C language, which he can use to calculate precision and nanosecond.
Grammar:
?
123 |
#include<time.h> int clock_gettime(clockid_t clk_id, struct timespec *tp); |
Parameters:
CLK_ID: Retrieves and sets the clk_id specified clock time.
Clock_realtime: System real-time, with the system changes in real time, that is, from the utc1970-1-1 0:0:0 start timing, intermediate time if the system time is changed by the user to other, the corresponding time corresponding change
- Clock_monotonic: Starting from the moment the system starts, it is not affected by the change of the system time by the user
- CLOCK_PROCESS_CPUTIME_ID: The time that this process takes to the current code system CPU
- CLOCK_THREAD_CPUTIME_ID: The time that this thread spends on the current code system CPU
?
123456789 |
struct timespec { time_t tv_sec; /* 秒*/ long tv_nsec; /* 纳秒*/ }; |
LocalTime ()
LocalTime is converting the number of seconds from 1970-1-1:00 to the current time system to local time.
Grammar
Description: The time that this function obtains for the TM structure body is the calendar time.
Usage: struct TM *localtime (const time_t *clock);
Return value: Returns a pointer to the TM structure. The TM struct is a structure defined in time.h for each amount of time (year, month, etc.) that is stored separately.
Example 1:
?
123456789101112 |
#include <stdio.h>
#include <stddef.h>
#include <time.h>
int main(
void
)
{
time_t timer;
//time_t就是long int 类型
struct tm *tblock;
timer =
time
(NULL);
tblock =
localtime
(&timer);
printf
(
"Local time is: %s\n"
,
asctime
(tblock));
return 0;
}
|
Execution Result:
Local time Is:mon Feb 16 11:29:26 2009
Example 2:
The above example uses the Asctime function, and the following example does not use this function to get the current time of the system. It should be noted that the year plus 1900, the month plus 1.
?
1234567891011 |
#include<time.h>
#include<stdio.h>
int main()
{
struct tm *t;
time_t tt;
time
(&tt);
t =
localtime
(&tt);
printf
(
"%4d年%02d月%02d日 %02d:%02d:%02d\n"
, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
return 0;
}
|
The difference between localtime () and Localtime_r ()
LocalTime ():
?
12345678910111213141516171819202122232425262728 |
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <stdio.h>
using namespace std;
int main(
int argc,
char *argv[])
{
time_t tNow =
time
(NULL);
time_t tEnd = tNow + 1800;
//注意下面两行的区别
struct tm
* ptm =
localtime
(&tNow);
struct tm
* ptmEnd =
localtime
(&tEnd);
char szTmp[50] = {0};
strftime
(szTmp,50,
"%H:%M:%S"
,ptm);
char szEnd[50] = {0};
strftime
(szEnd,50,
"%H:%M:%S"
,ptmEnd);
printf
(
"%s /n"
,szTmp);
printf
(
"%s /n"
,szEnd);
system
(
"PAUSE"
);
return EXIT_SUCCESS;
}
|
The final result is:
21:18:39
21:18:39
Inconsistent with the original idea.
Check out the localtime documentation and find this passage:
This structure is statically allocated and GKFX by the functions Gmtime and localtime. Each time either one of these functions are called the content of this structure is overwritten.
That means you can only use the localtime () function once at a time, or it will be rewritten!
The localtime () function need not be reentrant. A function, that is, required to being reentrant is not required to be thread-safe.
therefore localtime () is not reentrant. At the same time LIBC provides a reentrant version of the function Localtime_r ();
Unlike localtime (), the reentrant version is not required to set tzname.
Modify the program: (Localtime_r ())
?
12345678910111213141516171819202122232425262728293031 |
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <stdio.h>
using namespace std;
int main(
int argc,
char *argv[])
{
time_t tNow =
time
(NULL);
time_t tEnd = tNow + 1800;
//在这里修改程序
//struct tm* ptm = localtime(&tNow);
//struct tm* ptmEnd = localtime(&tEnd);
struct tm ptm = { 0 };
struct tm ptmEnd = { 0 };
localtime_r(&tNow, &ptm);
localtime_r(&tEnd, &ptmEnd);
char szTmp[50] = {0};
strftime
(szTmp,50,
"%H:%M:%S"
,&ptm);
char szEnd[50] = {0};
strftime
(szEnd,50,
"%H:%M:%S"
,&ptmEnd);
printf
(
"%s /n"
,szTmp);
printf
(
"%s /n"
,szEnd);
system
(
"PAUSE"
);
return EXIT_SUCCESS;
}
|
The final result is:
10:29:06
10:59:06
Tm
?
1234567891011 |
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日 */
int tm_isdst;
/* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */
};
|
Time function
Returned: 1970-1-1, number of seconds since 00:00:00
Prototype: time_t time (time_t *calptr)
Results can be obtained by return values or by parameters, see example
Header Files <time.h>
return value:
Success: Number of seconds, from 1970-1-1,00:00:00 can be used as integer output or for other functions
Failed:-1
Cases:
?
123 |
time_t now; time (&now); // 等同于now = time(NULL) printf ( "now time is %d\n" , now); |
Linux uses C to get the current time