Linux系统下C语⾔获取Time
获取时间的函数有很多,具体包括如下:
⼀、gettimeofday()获取当前微秒(us)等级的时间
time()/gettimeofday()等等,下⾯是获取具体到usecond的时间程序:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
using namespace std;
int main() {
struct tm *tm;
struct timeval tv;
gettimeofday(&tv,NULL);
tm = localtime(&tv.tv_sec);
printf("[%d-%02d-%02d %02d:%02d:%02d:%02d]\n",tm->tm_year + 1900,tm->tm_mon + 1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec); return0;
}
程序中需要引⼊对应的头⽂件:
#include <time.h>
#include <sys/time.h>
程序中调⽤了gettimeofday函数,函数获得的结果保存在结构体tv中,函数会把得到从1970年1⽉1⽇0时0分0秒到现在的秒数返回到第⼀个参数指向的结构体中,第⼆个参数是关于时区,如果不考虑填⼊NUL
L。
struct timeval结构体的成员如下所⽰:
/* A time value that is accurate to the nearest
microsecond but also has a range of years.  */
struct timeval
{
__time_t tv_sec;        /* Seconds.  */
__suseconds_t tv_usec;    /* Microseconds.  */
};
包括了两个部分,第⼀部分是second秒,第⼆部分是毫秒usecond。
⼆、localtime()将当前秒级时间转化为年⽉⽇时分秒结构
localtime函数的作⽤是将秒second转换为year、month、day、hour、minute、second。并把转换的结果保存在tm结构体中。
struct tm结构的成员如下:
/* Used by other time functions.  */
struct tm
{
linux字符串转数组
int tm_sec;            /* Seconds.    [0-60] (1 leap second) */
int tm_min;            /* Minutes.    [0-59] */
int tm_hour;            /* Hours.    [0-23] */
int tm_mday;            /* Day.        [1-31] */
int tm_mon;            /* Month.    [0-11] */
int tm_year;            /* Year    - 1900.  */
int tm_wday;            /* Day of week.    [0-6] */
int tm_yday;            /* Days in year.[0-365]    */
int tm_isdst;            /* DST.        [-1/0/1]*/
# ifdef    __USE_MISC
long int tm_gmtoff;        /* Seconds east of UTC.  */
const char *tm_zone;        /* Timezone abbreviation.  */
# else
long int __tm_gmtoff;        /* Seconds east of UTC.  */
const char *__tm_zone;    /* Timezone abbreviation.  */
# endif
};
三、time()获取当前秒(s)等级的时间
time()函数:获取到当前时间的秒数,这⾥需要注意的是时间变量类型time_t 这个变量⽬前是unsigned 64Bits的空间⼤⼩了,能够⾜够存储从1970年以来的us级别的时间值
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <time.h>
6 #include <sys/time.h>
7
8int main(void)
9 {
10    time_t tt;
11    tt = time(NULL);
12    printf("Time: %ld\n",tt);
13
14    time(&tt);
15    printf("Time: %ld\n",tt);
16 }
四、字符串与时间之间的转换 strftime() 和 strptime()
1. strptime() 函数:把时间格式字符串,按⼀定格式存储到tm结构体中。
函数声明:char *strptime(const char *buf,const char *format,struct tm *timeptr)
该函数有三个参数:
时间格式字符串,
时间格式。
tm 结构体的指针
2. strftime() 函数:把timeptr指向的结构体内容,根据format格式转换,并且存储在str中。
函数声明:size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
该函数有四个参数,
str -- 这是指向⽬标数组的指针,⽤来复制产⽣的 C 字符串。
maxsize -- 这是被复制到 str 的最⼤字符数。
format -- 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表⽰ tm 中所指定时间的相对应值
timeptr -- 这是由localtime函数返回的指向tm结构体的指针。
3. ⽤例程序如下C++(C)
1 #include <stdio.h>
2 #include <iostream> // #include <time.h> // Add this if C
3
4using namespace std; // Remove if C
5
6#define str_time "2021-11-13 18:30:22"
7
8int main(void)
9 {
10struct tm tm;
11char buf[255];
12
13    strptime(str_time, "%Y-%m-%d %H:%M:%S", &tm);
14    strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm);
15    puts(buf);
16return0;
17 }
运⾏结果:
4. format中的格式如下:
%a星期⼏的简写形式
%A星期⼏的全称
%b⽉份的简写形式
%B⽉份的全称
%c⽇期和时间
%d⽉份中的⽇期,0-31
%H⼩时,00-23
%I12进制⼩时钟点,01-12
%j年份中的⽇期,001-366
%m年份中的⽉份,01-12
%M分,00-59
%p上午或下午
%S秒,00-60
%u星期⼏,1-7
%w星期⼏,0-6
%x当地格式的⽇期
五. 这⾥封装⼀个时间相关的函数库⽅便调⽤
1 time_t get_timestamp_ms(void)
2 {
3  time_t timestamp_ms = 0;
4struct timeval tv;
5
6  gettimeofday(&tv,NULL);
7  timestamp_ms = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8return timestamp_ms;
9 }
10
11 time_t get_timestamp_us(void)
12 {
13  time_t timestamp_ms = 0;
14struct timeval tv;
15
16  gettimeofday(&tv,NULL);
17  timestamp_ms = tv.tv_sec * 1000000 + tv.tv_usec;
18return timestamp_ms;
19 }
View Code
未完待续!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。