我的目的

判断日期格式为yyyymmdd的日期列表是否连续,如20220313与20220314是否为连续两天。

关于ctime库

时间常见的有两种存储方式: time_t: 整数类型,用来存储从1970年到现在经过了多少秒 tm: 结构类型,把日期和时间以C结构体的形式保存,tm结构的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
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
int tm_year; // 自1900年起的年数
int tm_wday; // 一周中的第几天,范围从0到6,从星期日算起
int tm_yday; // 一年中的第几天,范围从0到365,从1月1日算起
int tm_isdst; // 夏令时
};

Function

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

char asctime(const struct tm timeptr); //将结构中的信息转换为真实世界的时间,以字符串的形式显示

char ctime(const time_t timep); //将timep转换为真是世界的时间,以字符串显示

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

struct tm* localtime(const time_t* timep); //和gmtime类似,但是它是经过时区转换的时间

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

Code

将string转化为struct tm

1
2
3
4
5
6
7
8
9
10
11
int main()
{
string date = "20220311";
struct tm mytm;
memset(&mytm, 0, sizeof(mytm));
sscanf(date.c_str(), "%4d%2d%2d", &mytm.tm_year, &mytm.tm_mon, &mytm.tm_mday);
mytm.tm_year -= 1900;
mytm.tm_mon--;

cout << mytm.tm_year << "-" << mytm.tm_mon << "-" << mytm.tm_mday << endl;
}

输出

1
122-2-11
## struct tm 转化为 time_t
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
string date = "20220311";
struct tm mytm;
memset(&mytm, 0, sizeof(mytm));
sscanf(date.c_str(), "%4d%2d%2d", &mytm.tm_year, &mytm.tm_mon, &mytm.tm_mday);
mytm.tm_year -= 1900;
mytm.tm_mon--;

cout << mytm.tm_year << "-" << mytm.tm_mon << "-" << mytm.tm_mday << endl;

cout << mktime(&mytm) << endl;
}
输出
1
2
122-2-11
1646928000
验证输出: 验证输出

检查是否连续(总代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstring>
#include <ctime>
#include <iostream>
#include <vector>

using namespace std;

time_t strTot(string date)
{
struct tm mytm;
memset(&mytm, 0, sizeof(mytm));
sscanf(date.c_str(), "%4d%2d%2d",
&mytm.tm_year, &mytm.tm_mon, &mytm.tm_mday);
mytm.tm_year -= 1900;
mytm.tm_mon--;
return mktime(&mytm);
}

int checkTimef(string dates[], int len)
{
time_t ts[len];
int ns[len];
for (int i = 0; i < len; i++)
{
ts[i] = strTot(dates[i]);
ns[i] = (ts[i] - ts[0]) / (24 * 60 * 60);
}
for (int i = 0; i < len - 1; i++)
{
if (ns[i + 1] - ns[i] != 1)
{
return 0;
}
}

return 1;
}

int main()
{
string dates[] = {"20220311", "20220312", "20220313"};
cout << checkTimef(dates, 3);
}

输出

1
1
# 参考链接 时间戳(Unix timestamp)转换工具

结尾

最后说说最近的心情,过两天就要出复试线了,求求复试踩线求求复试踩线求求复试踩线(;´д`)ゞ