c++ 获取当前时间_C++那些事之时间转换

C++那些事之时间转换

1.导语

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

374660c067e8cafc77b7765e36e0f718.png

今日,来学习一下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 <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 <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库


作者建立了一个《C++那些事》交流群,目前200人+,人数有限,点击公众号右下角->联系我,拉你入群。

e5ee03949ec95877d3df8a9a6ba3fac8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值