📜  C++ 中的时间和日期(tm 结构)(1)

📅  最后修改于: 2023-12-03 14:59:48.565000             🧑  作者: Mango

C++ 中的时间和日期 (tm 结构)

在 C++ 中,我们可以使用 time.h 头文件中的函数和 tm 结构来处理时间和日期。

tm 结构

tm 是 C++ 中用于表示日期和时间的结构体,其定义如下:

struct tm {
  int tm_sec;   // 秒 [0, 60]
  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],0 表示星期天
  int tm_yday;  // 一年中的天 [0, 365]
  int tm_isdst; // 夏令时标志,正数表示夏令时,0 表示不使用夏令时,负数表示未知
};

其中,tm_sec 是秒,tm_min 是分,tm_hour 是时,tm_mday 是一月中的天数,tm_mon 是月份(0-11,0 表示一月),tm_year 是年份(减去 1900),tm_wday 是星期几(0-6,0 表示星期天),tm_yday 是一年中的第几天,tm_isdst 是夏令时标志。

时间戳

时间戳是指当前时间距离 Unix 元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数,通常用 time_t 类型表示。我们可以使用 time 函数来获取当前的时间戳,例如:

time_t now = time(nullptr);

上述代码将获取当前时间戳并保存在 now 变量中。注意,如果调用 time 函数的参数为 nullptr,则返回的时间戳是当前的系统时间。

格式化时间

我们可以使用 strftime 函数将时间戳转换为指定格式的日期和时间字符串。其函数原型如下:

size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);

其中,s 参数是指向一个字符数组的指针,用来存储格式化后的日期和时间字符串,maxsize 是字符数组的大小,format 是指定格式的日期和时间字符串,timeptr 是指向一个 tm 结构体的指针,表示待格式化的时间。

例如,以下代码可以将当前时间戳格式化为 %Y-%m-%d %H:%M:%S 格式的日期和时间字符串:

char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&now));

上述代码会将格式化后的日期和时间字符串保存在 buffer 数组中。

解析时间字符串

我们可以使用 strptime 函数将日期和时间字符串解析成一个 tm 结构体。其函数原型如下:

char *strptime(const char *s, const char *format, struct tm *tm);

其中,s 参数是待解析的日期和时间字符串,format 是指定格式的日期和时间字符串,tm 是用于存储解析结果的 tm 结构体。

例如,以下代码可以将日期和时间字符串 %Y-%m-%d %H:%M:%S 解析成一个 tm 结构体:

struct tm t;
strptime("2022-05-21 14:30:00", "%Y-%m-%d %H:%M:%S", &t);

上述代码会将解析后的日期和时间保存在 t 变量中。

总结

C++ 中的 tm 结构可以用来表示日期和时间,time 函数可以获取当前时间戳,strftime 函数可以将时间戳格式化为指定格式的日期和时间字符串,strptime 函数可以将日期和时间字符串解析成 tm 结构体。了解和熟练掌握以上函数和概念,可以帮助我们更方便地处理日期和时间相关的操作。