❤️ c++获取当前时间,这有一个小细节! ❤️

本文介绍了C++中获取当前时间的基础概念,包括时间戳的定义和潜在的溢出问题,以及tm结构体如何存储时间。示例展示了如何使用ctime库获取并格式化当前时间。同时,讨论了localtime、localtime_s和localtime_r在不同系统平台上的适用性差异。
摘要由CSDN通过智能技术生成

c++ 获取当前时间

1、基础概念

  • 时间戳

时间戳,是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

typedef __int64 __time64_t;

typedef __time64_t time_t;

在c++中我们定义的数据类型time_t就是时间戳。目前相当一部分操作系统使用32位二进制数字表示时间。此类系统的时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为10000000 00000000 00000000 00000000,发生溢出错误,造成系统将时间误解为1901年12月13日20时45分52秒。这很可能会引起软件故障,甚至是系统瘫痪。使用64位二进制数字表示时间的系统(最多可以使用到格林威治时间292,277,026,596年12月04日15时30分08秒)则基本不会遇到这类溢出问题。
在这里插入图片描述

所以c++的源码中time_t定义为了64位的int,有意思的知识又增加了!这波是真的细!

  • 存储结构

c++使用一个名为tm的结构体存储时间,其中年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。

struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
    int tm_min;  /*分钟,0-59*/
    int tm_hour; /*小时, 0-23*/
    int tm_mday; /*日,即一个月中的第几天,1-31*/
    int tm_mon;  /*月, 从一月算起,0-11*/  1+p->tm_mon;
    int tm_year;  /*年, 从1900至今已经多少年*/  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
    int tm_isdst; /*日光节约时间的旗标*/
};

2、应用举例

  • 头文件

#include <time.h>

  • 输出时间

输出一个yy/mm/dd hh:mm:ss格式的当前时间

#include <iostream>
#include <string>
#include <time.h>

std::string GetNowTime() {
	time_t setTime;
	//获取时间戳
	time(&setTime);
	tm ptm;
	//通过时间戳计算得到当前时间
	localtime_s(&ptm, &setTime);
	std::string time = std::to_string(ptm.tm_year + 1900)
		+ "/"
		+ std::to_string(ptm.tm_mon + 1)
		+ "/"
		+ std::to_string(ptm.tm_mday)
		+ " "
		+ std::to_string(ptm.tm_hour) + ":"
		+ std::to_string(ptm.tm_min) + ":"
		+ std::to_string(ptm.tm_sec);
	return time;
}

//test
int main(int argc, char *argv[]) {
	std::string strTime = GetNowTime();
	std::cout << "now time: " << strTime << std::endl;
	system("pause");
	return 0;
}
  • localtime、localtime_s和localtime_r的区别和使用

localtime、localtime_s、localtime_r都是用于获取系统时间,其中localtime_r用于Linux平台下获取系统时间localtime_s用于Windows平台获取系统时间,而localtime获取系统时间不区分系统。

在不涉及多线程,且只有一个系统时间的情况下,比如获取系统当前时间,使用localtime即可;但是在需要将多个时间转化为系统时间的格式,或者是多线程中使用时,应该根据系统类型选择使用localtime_s或localtime_r
在这里插入图片描述

注:至于为什么会特意提到这三长得几乎一样的函数这件事,其实是localtime编译直接告诉我不安全,那我想不安全换一个呗,需求还能不写了不成?度娘告诉我localtime_s能行,于是windows写代码的时候它是真的行,但是换linux部署的时候就凉凉咯,又换成了localtime_r。所以我决定给它三直接挂网上网b一波,兄弟们我做的对吗?

❤️ 来都来了,不点个赞吗,不点点关注吗,不唠两句嗑吗?灰常感谢!!! ❤️

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值