Linux API -- 时间函数
程序员文章站
2022-03-09 21:43:21
...
time时间函数
#include <time.h>
time_t time(time_t *ptr);
这个函数返回从UNIX新纪元( 1970年1月1日00:00:00 UTC )开始到现在经过的秒数,并且是按照UTC协调时间进行计算,统称为日历时间。它的精度是秒。
clock_gettime
#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
int clock_settime(clockid_t clock_id, struct timespec *tsp);
返回值:正确返回0,出错返回-1
POSIX标准定义的时钟支持,clock_id可选择以下值:
CLOCK_REALTIME: 实时系统时间,和time功能一样,但是返回的时间值精度可能会更高
CLOCK_MONOTONIC: 不带负跳数的实时系统时间
CLOCK_PROCESS_CPUTIME_ID: 调用进程的CPU时间
CLOCK_THREAD_CPUTIME_ID: 调用线程的CPU时间
对应的时间结构体:
struct timespec{
time_t tv_sec; /*秒s*/
long tv_nsec; /*纳秒ns*/
};
gettimeofday
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, struct timezone *gz);
int settimeofday(const struct timeval *tv, const struct timezone *gz);
这两个函数的实现依赖于平台,可能不具有一致性,有的平台tz只接受NULL为输入值,Linux平台支持传入时区,返回的是以距离UNIX新纪元开始计算到当前的时间值。和time一样,但是精度能达到微秒级别。
对应的时间结构体:
struct timeval
{
int tv_sec;
int tv_usec;
};
转换
#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
time_t mktime(struct tm *tmptr);
gmtime是用于把日历时间转换为UTC时间的年、月、日、时、分、秒的分解结构体,localtime用于把日历时间转换为本地时间的分解结构体,和gmtime相比,考虑了本地时区和夏令时标志进行的转换。
mktime是把本地时间转换为日历时间的函数,一定注意的是必须是本地分解时间,它相当于localtime的逆过程。
分解时间的结构体:
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year; //从1900开始算起,因此要加1900得出实际年份
int tm_wday;
int tm_yday;
int tm_isdst;
};
示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
static void show_time_t(void)
{
time_t now;
now = time(NULL);
printf("time_t now: %ld\n",(long) now);
}
static void show_timeval(void)
{
struct timeval tv;
int ret;
gettimeofday(&tv, NULL);
printf("timeval.tv_sec:%ld timeval.tv_usec:%ld\n",
(long)tv.tv_sec, (long)tv.tv_usec);
}
static void show_timespec(void)
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
printf("timespec.tv_sec:%ld timespec.tv_nsec:%ld\n",
(long)ts.tv_sec, (long)ts.tv_nsec);
}
static void show_utc_time(void)
{
struct tm *gm;
time_t now;
now = time(NULL);
gm = gmtime(&now);
printf("UTC:%d-%d-%d %d:%d:%d\n",
1900+gm->tm_year, gm->tm_mon, gm->tm_mday,
gm->tm_hour, gm->tm_min, gm->tm_sec);
}
static void show_localtime(void)
{
struct tm *gm;
time_t now;
now = time(NULL);
gm = localtime(&now);
printf("LOCAL:%d-%d-%d %d:%d:%d\n",
1900+gm->tm_year, gm->tm_mon, gm->tm_mday,
gm->tm_hour, gm->tm_min, gm->tm_sec);
}
int main(int argc, char *argv[])
{
show_time_t();
show_timeval();
show_timespec();
show_utc_time();
show_localtime();
exit(0);
}
运行结果如下:
$ ./time
time_t now: 1553755961
timeval.tv_sec:1553755961 timeval.tv_usec:903515
timespec.tv_sec:1553755961 timespec.tv_nsec:903521280
UTC:2019-2-28 6:52:41
LOCAL:2019-2-28 14:52:41
上一篇: 不要“好为人师”
下一篇: 抖音怎么拍摄大长腿特效视频?
推荐阅读
-
python 限制函数执行时间,自己实现timeout的实例
-
mysql 时间转换函数的使用方法第1/2页
-
Linux 在Shell脚本中使用函数实例详解
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java8 日期和时间API
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
linux system函数深入理解
-
Linux VPS vsftp/proftpd FTP时间差八小时的解决方法
-
Linux date 时间设置同步命令分享
-
php 计算两个时间戳相隔的时间的函数(小时)