我是靠谱客的博主 无心过客,最近开发中收集的这篇文章主要介绍c/c++时间类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、time_t

time_t 类型,这本质上是一个长整数,表示从1970-01-01 00:00:00到目前计时时间的秒数,如果需要更精确一点的,可以使用timeval精确到毫秒。

time_t cur = time(NULL);

2、struct timeval

在time.h中的定义为:

struct timeval
{
	__time_t tv_sec;        /* Seconds. */
	__suseconds_t tv_usec;    /* Microseconds. */
};

其中,tv_sec为Epoch(1970-1-1零点零分)到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。毫秒(ms): tv.tv_usec/1000。

gettimeofday(&tv, NULL);//获取当前时间

3、struct tm

在标准库wchar.h内,我们可以看到结构体tm的声明如下:

#ifndef _TM_DEFINED
struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };
#define _TM_DEFINED
#endif  /* _TM_DEFINED */
  1. 注意月份是0-11,而不是1-12,所以在tm结构体与string转换的时候,要相应的做减1加1处理。
  2. tm_isdst为夏令时设置,0为非夏令时,1为夏令时。由于21世纪的中国并没有实行夏令时制度,所以编写国内程序我们可以忽略这个变量。

利用这个结构体,我们就可以完成日期时间与string字符串的转换了,由于计算的方便,我们一般选择将日期时间的string转换成time_t类型。

4、常用的时间函数

 //取得从1970年1月1日至今的秒数
time_t time(time_t *t);

 //将结构中的信息转换为真实世界的时间,以字符串的形式显示 // Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份。
char *asctime(const struct tm *tm);

//将timep转换为真实世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样 //  Mon Jan 11 08:23:14 2021
char *ctime(const time_t *timep); 

//将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针
struct tm *gmtime(const time_t *timep); 

//和gmtime类似,但是它是经过时区转换的时间。
struct tm *localtime(const time_t *timep); 
struct tm *localtime_r(const time_t *timep, struct tm *result); //线程安全的

 //将struct tm 结构的时间转换为从1970年至今的秒数
time_t mktime(struct tm *tm);

//返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用
int gettimeofday(struct timeval *tv, struct timezone *tz); 

//返回两个时间相差的秒数
double difftime(time_t time1, time_t time2); 
asctime_r(), ctime_r(), gmtime_r() // 时间函数的 _r 版本都是线程安全的。

//时间转字符串
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr); 

//字符串转时间

char *strptime(const char *str, const char *format, struct tm *timeptr); 

5、日期时间处理与字符串string转换

c/c++日期时间处理与字符串string转换

  1. 日期时间string转换为time_t

    time_t StringToDatetime(string str)
    {//2021-08-25 12:00:00
        tm tm_;                                    // 定义tm结构体。
        sscanf(str.c_str(), "%d-%d-%d %d:%d:%d", &tm_.tm_year, &tm_.tm_mon, &tm_.tm_mday, &tm_.tm_hour, &tm_.tm_min, &tm_.tm_sec);// 将string存储的日期时间,转换为int临时变量。
        tm_.tm_year -=  1900;                 // 年,由于tm结构体存储的是从1900年开始的时间,所以tm_year减去1900。
        tm_.tm_mon -= 1;                    // 月,由于tm结构体的月份存储范围为0-11,所以tm_mon减去1。
        tm_.tm_isdst = 0;                          // 非夏令时。
        time_t t_ = mktime(&tm_);                  // 将tm结构体转换成time_t格式。
        return t_;                                 // 返回值。
    }
    
  2. 日期时间time_t转换为string

    string DatetimeToString(time_t time)
    {
        tm *tm_ = localtime(&time);                // 将time_t格式转换为tm结构体
        char s[64]={0};      // 定义总日期时间char*变量。
        sprintf(s, "%04d-%02d-%02d %02d:%02d:%02d", tm_->tm_year+1900, tm_->tm_mon + 1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);// 将年月日时分秒合并。
        return string(s);  // 返回转换日期时间后的string变量。
    }
    

最后

以上就是无心过客为你收集整理的c/c++时间类型的全部内容,希望文章能够帮你解决c/c++时间类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部