前言:
最近在做好多家公司的笔试题,发现他们还都挺喜欢考关于time函数这部分的。于是我就写了今天这篇文章,希望对大家有所帮助。
一,关于time.h
1,关于time
time_t time(time_t *seconds)
2,struct tm
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]*/
#ifdef __USE_BSD
long int tm_gmtoff; /* Seconds east of UTC. */
__const char *tm_zone; /* Timezone abbreviation. */
#else
long int __tm_gmtoff; /* Seconds east of UTC. */
__const char *__tm_zone; /* Timezone abbreviation. */
#endif
};
二,示例代码
1,int_time
首先呢,我们先设计一个类,用于存放我们所需要的时间,并将其按照年月日时分秒的形式进行成员存储。
#include<ctime>
class int_time {
private:
int year, month, day, hour, min, sec;
public:
int_time(const int year = 1900, const int month = 1,const int day = 0,const int hour = 0,const int min = 0,const int sec = 0) : year(year), month(month),day(day),hour(hour),min(min),sec(sec){}
int_time(const std::tm& timeInfo) : year(timeInfo.tm_year + 1900), month(timeInfo.tm_mon + 1), day(timeInfo.tm_mday), hour(timeInfo.tm_hour), min(timeInfo.tm_min), sec(timeInfo.tm_sec) {}
int_time(const int_time& x) : year(x.Getyear()), month(x.Getmonth()), day(x.Getday()), hour(x.Gethour()), min(x.Getmin()), sec(x.Getsec()) {}
void InitDateTime();
int Getyear() const;
int Getmonth() const;
int Getday() const;
int Gethour() const;
int Getmin() const;
int Getsec() const;
void PrintDateTime() const;
int_time AddDay(int day) const;
};
可以看到呢,我在进行构造函数的编写时设置了相应的默认值,以保证初始化可以不需传递任何参数,但是同时也可以将自己定义的时间进行相应构造。
2,InitDateTime
第一个成员函数InitDateTime,代码如下:
void int_time::InitDateTime() {
// 获取当前时间
time_t currentTime = std::time(nullptr);
// 将当前时间转换为tm结构体,以便访问各个时间成员
tm* timeInfo = std::localtime(¤tTime);
// 获取年、月、日、时、分、秒并赋值给整型变量
year = timeInfo->tm_year + 1900; // 年份从1900年开始
month = timeInfo->tm_mon + 1; // 月份从0开始,所以需要加1
day = timeInfo->tm_mday;
hour = timeInfo->tm_hour;
min = timeInfo->tm_min;
sec = timeInfo->tm_sec;
}
可以看到我在初始化这部分中首先调用time函数读取系统当前时间,然后通过localtime函数 将当前时间转换为tm结构体类型(这个前文已经提及,此处不再详述),然后将其结构体成员数据取出放在自己的成员属性下。
3,AddDay
关于中间的Getyear等函数以及打印函数我觉得没必要浪费各位时间所以咩有在此处书写细节进行讲解,如果各位有问题请给作者留言,谢谢!
关于这个AddDay函数是整个代码的重中之重,即根据当前时间调度day天以后的时间日期,这里我以日期为例,各位看官如果有别的需求可稍微修改调整,大差不差。
int_time int_time::AddDay(int day) const {
// 创建一个tm结构体并填充各个成员
std::tm timeInfo = {};
timeInfo.tm_year = Getyear() - 1900; // 年份从1900年开始
timeInfo.tm_mon = Getmonth() - 1; // 月份从0开始
timeInfo.tm_mday = Getday();
timeInfo.tm_hour = Gethour();
timeInfo.tm_min = Getmin();
timeInfo.tm_sec = Getsec();
// 使用mktime函数将tm结构体转换为time_t形式
std::time_t currentTime = std::mktime(&timeInfo);
currentTime += (time_t)day * 24 * 60 * 60;
std::tm futureTimeInfo = *std::localtime(¤tTime);
return int_time(futureTimeInfo);
}
作者是一个非常喜欢用实例代码演示讲解的人,可以看到在上述代码中,我先建立了一个局部变量tm结构体对象timeInfo,然后将对象本身属性赋值给timeInfo,而后把他利用mktime函数翻转回time_t类型,而后对他进行相应的加时间操作,最后转回来并创建右值返回。
三,示例
int main() {
int_time t;
t.InitDateTime();
t.PrintDateTime();
(t.AddDay(100)).PrintDateTime();
return 0;
}
最后,写文不易,不收藏也请给个赞,谢谢亲~!
(本文仅供学习时参考,如有错误,纯属作者技术不到位,不足之处请多指教,谢谢)