前言
C++ 中获取精度为秒的时间只有一种方式,就是 std::time。这个函数是从 C 里来的,使用也非常简单,不多说。本文的主要是介绍围绕 std::time 相关用于格式化时间的函数。
其它获取时间的方式,比如:std::colck、std::chrono,精度都比较高,同时也比较慢,慢了 2~3 个数量级。有兴趣可以自己比较一下 http://quick-bench.com/。
相关函数和结构体链接清单
相关结构体
下文中
纪元时间
即现在(UTC 时间)到 1970 年 1 月 1 日 0 时 0 分 0 秒的秒数,本地时间
即纪元时间加上时区。
std::tm
保存着日期和时间。
std::\tm::tm_year(年)从 1900 开始(纪元时间从 1970 年开始)。
std::\tm::tm_mon(月)的范围是 [0, 11] 而不是 [1, 12]。
std::\tm::tm_sec (秒)的范围是 [0, 60],因为存在闰秒。
std::\tm::tm_isdst,值为正的时候表示夏令时有效。夏令时即夏天时间在原来的基础上加一个小时,比如原来是 6:00,夏令时生效了现在太阳还是在同一个位置但时间却是 7:00。
其它字段点击本节标题查看。
函数详情
std::time
std::time_t time(
std::time_t * arg
);
多数系统遵循 POSIX 规定,返回保有纪元时间的整数类型值。如果参数不为 nullptr 也将返回值保存到指针指向的对象。
测试发现返回值与系统时区无关。
std::localtime
std::tm* localtime(
std::time_t const * time
);
输入纪元时间输出本地时间的日期(年月日)和时间(时分秒)。
因为返回值是指向内部的一个静态变量的指针,所以在需要长时间使用返回值时最好先保存一份副本而不是通过返回的指针去读数据,不然可能因为别的函数的操作导致在使用的过程中前后数据不一致。
std::gmtime
std::tm* gmtime(
std::time_t const * time
);
输入纪元时间输出转换为以协调世界时( UTC )表达的日期和时间。
因为返回值是指向内部的一个静态变量的指针,所以在需要长时间使用返回值时最好先保存一份副本而不是通过返回的指针去读数据,不然可能因为别的函数的操作导致在使用的过程中前后数据不一致。
std::strftime
std::size_t strftime(
char * str,
std::size_t count,
char const * format,
std::tm const * time
);
输入缓冲区、缓冲区长度、转换格式和时间,如果缓冲区够大(能容纳转换后的数据以及结尾的 '\0'
),输出转换后的数据的长度(不包括结尾的 '\0'
)以及将数据保存到缓冲区,如果缓冲区不够大,输出 0 ,缓冲区的内容是未定义的。
auto t = std::time(nullptr);
char buffer[128];
std::strftime(
buffer,
sizeof(buffer),
"%Y/%m/%d %H:%M:%S",
std::localtime(&t)
);
std::cout << buffer << std::endl;
输出:
2020/03/31 18:06:43
format 支持的格式可点击本节标题查看。
std::asctime 弃用
char * asctime(
std::tm const * time_ptr
);
输入时间,输出固定格式的时间。如同调用 std::strftime(buffer, count, "%a %b %d %H:%M:%S %Y\n", &tm);
,buffer 用的是内部静态空间,不是线程安全的。
注意后面格式化的数据后有一个
'\n'
。
std::ctime 弃用
char * ctime(
std::time_t const * time
);
输入时间,输出固定格式的时间。如同调用 std::asctime(std::localtime(time))
。
std::put_time
template <class CharT>
/*未指定*/ put_time(
std::tm const * tmb,
CharT const * fmt
);
与前面几个从 C 继承下来的不同,这个函数是 C++ 特有的,可以和 C++ 的流配合。其它函数位于头文件 <ctime>,这个函数位于头文件 <iomanip>。
auto t = std::time(nullptr);
std::cout
<< std::put_time(
std::localtime(&t),
"%Y/%m/%d %H:%M:%S"
)
<< std::endl;
输出:
2020/03/31 18:44:32
fmt 支持的格式可点击本节标题查看。
网友评论