C语言时间类函数 API

头文件
#include <time.h>

关于时间的系统结构体

struct tm 结构体

结构体描述
        这是一个用来保存时间和日期的结构。
结构体原型
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 到 11 */
    int tm_year; /* 自 1900 年起的年数 */
    int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
    int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
    int tm_isdst; /* 夏令时 */
};

相关函数 API

生成时间函数 time

函数原型
time_t time(time_t *tloc);
描述
        返回自纪元 Epoch 1970-01-01 00:00:00 UTC )起经过的时间,以秒为单位。如果 tloc不为空,则返回值也存储在变量 tloc
参数
        保存 自纪元 Epoch 1970-01-01 00:00:00 UTC )起经过的时间值的指针,一般为NULL。
返回值:
        自纪元 Epoch 1970-01-01 00:00:00 UTC )起经过的时间,以秒为单位
备注:
        无

计时函数 clock

函数原型
typedef long clock_t;
#define CLOCKS_PER_SEC ((clock_t)1000000)
clock_t clock(void)
描述
        该函数可以返回从这个进程开始到调用这个函数的 CPU 时钟计时单元 ( clock tick)数,在 MSDN 中称之为挂钟时间( wal-clock )。
备注:
        1.返回值是一个毫秒数,一般需要强转为浮点型然后除以 CLOCKS_PER_SEC
        2.clock 是 CPU 线程计时的,所以程序中使用 sleep 函数 CPU 会停止计数,也就是计时最后不会算是 sleep 延时的时间。
使用实例
int main()
{
    //printf("%ld\n",clock());
    long int i = clock();
    printf("%ld\n",i); //循环开始前的 CPU 计时
    for(int z=0 ; z<100000000;z++);
    long int j = clock();
    printf("%ld\n",j);//循环结束时的计时
    printf("%lf\n",(double)(j-i)/CLOCKS_PER_SEC); //计时循环持续了多少秒
    return 0;
}

 返回当地时间函数 ctime

函数原型
char *ctime(const time_t *timer)
描述:
        返回一个表示当地时间的字符串,当地时间是基于参数 timer 。返回的字符串格式如下:Www Mmm dd hh:mm:ss yyyy 其中, Www 表示星期几, Mmm 是以字母表示的月份,dd 表示一月中的第几天, hh:mm:ss 表示时间, yyyy 表示年份。
参数
        这是指向 time_t 对象的指针,该对象包含了一个日历时间。一般为保存 time 的返回值的指针。
返回值
        该函数返回一个 C 字符串,该字符串包含了可读格式的日期和时间信息。
使用示例
int main()
{
    time_t t;
    time(&t);
    printf("%s",ctime(&t));
    return 0;
}

相差秒数函数 difftime 

函数原型
        double difftime(time_t time1, time_t time2)
描述
        返回 time1 time2 之间相差的秒数 (time1 - time2) 。这两个时间是在日历时间中指定的,表示了自纪元 Epoch (协调世界时 UTC 1970-01-01 00:00:00 )起经过的时间。
返回值:
        该函数返回以双精度浮点型 double 值表示的两个时间之间相差的秒数 (time1 - time2)
使用示例
int main()
{
    time_t start_t, end_t;
    double diff_t;
    printf("程序启动...\n");
    time(&start_t);
    printf("休眠 5 秒...\n");
    sleep(5);
    time(&end_t);
    diff_t = difftime(end_t, start_t);
    printf("执行时间 = %f\n", diff_t);
    printf("程序退出...\n");
    return(0);
}

结构体 tm 表示的时间函数 asctime

函数原型
char *asctime(const struct tm *timeptr)
描述
        返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间
返回值:
        该函数返回一个 C 字符串,包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy,其中, Www 表示星期几, Mmm 是以字母表示的月份, dd 表示一月中的第几天,hh:mm:ss 表示时间, yyyy 表示年份。
示例
int main()
{
    struct tm t;
    t.tm_sec = 10;
    t.tm_min = 10;
    t.tm_hour = 6;
    t.tm_mday = 25;
    t.tm_mon = 2;
    t.tm_year = 89;
    t.tm_wday = 6;
    puts(asctime(&t));
    return(0);
}

计算世界标准时间函数 gmtime 

函数原型
struct tm *gmtime(const time_t *timer)
描述
        使用 timer 的值来填充 tm 结构,并用协调世界时( UTC )也被称为格林尼治标准时间(GMT )表示。
使用示例
#define BST (+1)
#define CCT (+8)
int main ()
{
    time_t rawtime;
    struct tm *info;
    time(&rawtime);
    /* 获取 GMT 时间 */
    info = gmtime(&rawtime );
    printf("当前的世界时钟:\n");
    printf("伦敦:%2d:%02d\n", (info->tm_hour+BST), info->tm_min);
    printf("中国:%2d:%02d\n", (info->tm_hour+CCT), info->tm_min);
    return(0);
}

本地时区的 tm 表示函数 localtime  

函数原型
struct tm *localtime(const time_t *timer)
描述
        使用 timer 的值来填充 tm 结构。 timer 的值被分解为 tm 结构,并用本地时区表示
使用示例
int main ()
{
    time_t rawtime;
    struct tm *info;
    char buffer[80];
    time( &rawtime );
    info = localtime( &rawtime );
    printf("当前的本地时间和日期:%s", asctime(info));
    return(0);
}

 结构体 tm 时间表示转换为 time_t 表示函数 mktime

函数原型
time_t mktime(struct tm *timeptr)
描述
        把 timeptr 所指向的结构转换为自 1970 1 1 日以来持续时间的秒数,发生错误时返回-1

格式化时间输出函数 strftime

函数原型
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
描述
        根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。
参数
        str: 这是指向目标数组的指针,用来复制产生的 C 字符串
        maxsize: 这是被复制到 str 的最大字符数
        format: 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。格式说明符如下表所示:

        timeptr: 这是指向 tm 结构的指针 

返回值
        如果产生的 C 字符串小于 size 个字符(包括空结束字符),则会返回复制到 str 中的字符总数(不包括空结束字符),否则返回零
使用示例:
int main ()
{
    time_t rawtime;
    struct tm *info;
    char buffer[80];
    time( &rawtime );
    info = localtime( &rawtime );
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
    printf("格式化的日期 & 时间 : |%s|\n", buffer );
    return(0);
}

 微妙级时间获取函数 gettimeofday

头文件
#include <sys/time.h>
函数原型:
int gettimeofday(struct timeval *tv,struct timezone *tz )
描述:
        Linux 下可以使用 gettimeofday()来查看当前时间,这个函数会计算从 1970 年 1 月 1 号 00:00(UTC)到当前的时间跨度。 使用函数 gettimeofday()函数可以得到精确时间。它的精度可以达到微妙。
参数
        tv:timeval 结构体
struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微妙*/
};
        tz:timezone 结构体,一般填 NULL 就行,因为 linux 内核一般不会使用
struct timezone
{
    int tz_minuteswest;/*和 greenwich 时间差了多少分钟*/
    int tz_dsttime; /*type of DST correction*/
}
返回值:
        成功返回 0 ,失败返回 -1
备注
        一般来说,我们使用 gettimeofday() 多是用来计算时间差,下面是计算时间差来计算微妙级计时。
使用示例:
const unsigned long Converter = 1000 * 1000; // 1s == 1000 * 1000 us
int main(void)
{
    struct timeval val;
    int ret = gettimeofday(&val, NULL);
    sleep(2); // 睡眠 2s
    struct timeval newVal;
    ret = gettimeofday(&newVal, NULL);
    printf("start: sec --- %ld, usec --- %ld\n", val.tv_sec,val.tv_usec);
    printf("end: sec --- %ld, usec --- %ld\n", newVal.tv_sec,newVal.tv_usec);
    unsigned long diff = (newVal.tv_sec * Converter + newVal.tv_usec) - (val.tv_sec *         Converter + val.tv_usec);
    printf("diff: sec --- %ld, usec --- %ld\n", diff /
    Converter, diff % Converter);
    return 0;
}

 纳秒级时间获取函数 clock_gettime

头文件
#include <time.h>
函数原型:
int clock_gettime(clockid_t clk_id, struct timespec * tp);
描述:
        函数"clock_gettime" 是基于 Linux C 语言的时间函数 , 他可以用于计算精度和纳秒
参数
        clk_id: 时钟类型, posix 标准定义了下面的四种基本类型, Linux 系统有其他的扩充
                CLOCK_REALTIME:系统实时时间, 随系统实时时间改变而改变 , 即从 UTC1970-1-1 0:0:0 开始计时, 中间时刻如果系统时间被用户改成其他 , 则对应的时间相应改变。
                CLOCK_MONOTONIC:从系统启动这一刻起开始计时 , 不受系统时间被用户改变的影响
                CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统 CPU 花费的时间。需要注意
是不是进程开始到当前代码的时间。
                CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统 CPU 花费的时间。需要注意是不是线程开始到当前代码的时间。
        tp:timespec 结构体,结构如下:
struct timespec
{
    time_t tv_sec;//秒数
    long tv_nsec;//纳秒
};
返回值:
        成功返回 0 ,失败返回 -1
示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
    struct timespec time1 = {0};
    clock_gettime(CLOCK_REALTIME, &time1);
    printf("CLOCK_REALTIME: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
    clock_gettime(CLOCK_MONOTONIC, &time1);
    printf("CLOCK_MONOTONIC: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
    sleep(5);
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    printf("CLOCK_PROCESS_CPUTIME_ID: (%lu, %lu)\n",time1.tv_sec, time1.tv_nsec);
    sleep(5);
    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time1);
    printf("CLOCK_THREAD_CPUTIME_ID: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
    printf("now time :%lu\n", time(NULL));
    return 0;
}

 延时操作

秒延时函数 sleep

头文件
#include <unistd.h>
函数原型:
unsigned int sleep(unsigned int seconds);
描述:
        执行挂起一段时间,也就是等待一段时间在继续执行
参数
        seconds: 延时时间
返回值
        成功则返回 0 ,如果延时过程中被打断,则返回剩余的秒数
备注
        延时单位秒

微秒延时函数 usleep

头文件
#include <unistd.h>
函数原型:
int usleep(useconds_t usec);
描述:
        执行挂起一段时间,也就是等待一段时间在继续执行
参数
        usec: 延时时间
返回值
        成功则返回 0 ,失败返回 -1
备注
        延时单位微秒, 1000,000 微妙 =1

纳秒延时函数 ndelay

头文件
#include <linux/delay.h>
函数原型:
void ndelay(unsigned long nsecs);
描述:
        执行挂起一段时间,也就是等待一段时间在继续执行
参数
        nsecs: 延时时间
返回值
        无
备注
        延时单位纳秒, 1000,000,000 纳妙 =1 秒,一些系统可能不会支持此函数头文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Paho C库中,你可以使用以下异步处理的C语言函数API: 1. `MQTTAsync_create`:用于创建一个MQTT客户端对象。 ```c int MQTTAsync_create(MQTTAsync* handle, const char* serverURI, const char* clientId, int persistence_type, void* persistence_context); ``` 2. `MQTTAsync_setCallbacks`:用于设置回调函数,当收到消息或发生错误时会调用这些回调函数。 ```c int MQTTAsync_setCallbacks(MQTTAsync handle, void* context, MQTTAsync_connectionLost* cl, MQTTAsync_messageArrived* ma, MQTTAsync_deliveryComplete* dc); ``` 3. `MQTTAsync_connect`:用于连接到MQTT代理服务器。 ```c int MQTTAsync_connect(MQTTAsync handle, const MQTTAsync_connectOptions* options); ``` 4. `MQTTAsync_sendMessage`:用于发送MQTT消息。 ```c int MQTTAsync_sendMessage(MQTTAsync handle, const char* destinationName, const MQTTAsync_message* message, MQTTAsync_responseOptions* response); ``` 5. `MQTTAsync_subscribe`:用于订阅MQTT主题。 ```c int MQTTAsync_subscribe(MQTTAsync handle, const char* topicFilter, int qos, MQTTAsync_responseOptions* response); ``` 6. `MQTTAsync_unsubscribe`:用于取消订阅MQTT主题。 ```c int MQTTAsync_unsubscribe(MQTTAsync handle, const char* topicFilter, MQTTAsync_responseOptions* response); ``` 这些函数提供了基本的异步处理功能,可以用于创建MQTT客户端、连接到代理服务器、发送和接收消息以及订阅和取消订阅主题等操作。你可以根据自己的需求使用这些函数来实现异步处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值