首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++那些事之时间转换

C++那些事之时间转换

作者头像
公众号guangcity
发布2020-06-09 12:00:15
1.9K0
发布2020-06-09 12:00:15
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

C++那些事之时间转换

1.导语

首先感谢各位对《C++那些事》的持续关注,也感谢各大公众号的推荐!也欢迎大家积极推荐本项目,让更多人从中学习并提出一些问题来,不断完善项目,《C++那些事》这两天霸榜github trending C++,下图可见:

今日,来学习一下Linux时间相关函数。我们来定个目标学习这个东西吧,这样不谈空话,论实践与理论相结合学习。

目标1:请使用C/C++获取Linux的当前时间,并转换成你想要的格式,例如:2020-06-04 11:12:01,然后再转为Unix时间戳,例如:1591240321,最后计算当前时间与之前的某个时间的间隔,是相差多少天,还是相差多少秒,还是相差多少分钟等等。

目标2:请完成字符串转Unix时间戳。

上述可以通过C++11的chrono实现,感兴趣的可以实现一下,本节通过Linux函数来实现。

2.实践

首先引入tm结构体,很多人估计没听过tm,tm是时间的一个结构体。

具体结构在,time.h

struct tm
{
  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]*/
  ...
  ...
  ...
}

目标2比较直观,我们先完成这个吧,现在有个时间:

2020-06-02 21:09:00

转换成对应的uninx时间戳:1591103340。

这里给出两种实现方式。

方式1:strptime函数。

time_t Str2UnixTime(std::string time_str) {
  struct tm tm;
  memset(&tm, 0, sizeof(tm));

  strptime(time_str.c_str(), "%F %H:%M:%S", &tm);
  return mktime(&tm);
}

调用:

std::string str = "2020-06-02 21:09:00";
time_t t = Str2UnixTime(str);
std::cout << t << std::endl;

方式2:

time_t StrToUnixTime2(std::string time_str) {
  struct tm tm;
  memset(&tm, 0, sizeof(tm));

  sscanf(time_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);

  tm.tm_year -= 1900;
  tm.tm_mon--;
  return mktime(&tm);
}

调用同上,说一下上述为啥减去1900与--操作。

具体大家要看一下tm结构体,上面已经列出来了,划上去看一下,注释里面提到,tm_year是从1900年开始,tm_mon是0-11范围,所以tm_year是要减去1900,而tm_mon是要减去1。

上述几个函数解释:

  • mktime
    • 将参数tm所指的tm结构数据转换成时间戳(秒数)。
  • sscanf
    • 从字符串读取格式化输入
  • strptime
    • 将一个字符串格式化为一个tm结构

至此就完成了第二个目标,下面来完成第一个目标。

目标1实现:

要获取当前时间,直接time函数即可搞定:

time_t now_time;
time(&now_time);
cout << now_time<< endl;

此时获取的是时间戳,那怎么完成时间戳到自己的格式转换呢?

这就需要使用strftime:

char stime[256] = {0};
strftime(stime, sizeof(stime), "%F %H:%M:%S", localtime(&now_time));

一行代码搞定从1591242267转换为2020-06-04 11:44:27。

  • localtime将time_t转换为tm结构体。
  • strftime将tm格式化为对应的时间格式。

最后,如何完成目标1中的计算当前时间与之前的某个时间的间隔,是相差多少天,还是相差多少秒,还是相差多少分钟等等呢?

很简单:

double seconds = difftime(ft, t);

直接通过difftime将两个时间戳的相差秒数拿到,然后将秒数转换为分钟、天等就好了。

3.总结

  • 时间转换非常灵活
  • 本节使用的时间函数是Linux系统库函数
  • 后面推展可以使用c++11的时间chrono库
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++那些事之时间转换
    • 1.导语
      • 2.实践
        • 3.总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档