C++如何获取当前时间
C++获取当前时间
导读
之前实习的时候,需要实现写日志的功能,日志当然要记录时间了,没想到在网上半天找不到满意的答案,于是自己统计了资料之后写了这篇博文。
我把代码和相关的结果都放在了下面,不搞空的,Show me code!
本文首先介绍了使用C库的接口来获取当前时间的方法,然后介绍了使用C++11标准库中的函数来获取当前时间的方法。此外,文章还介绍了使用函数strftime来格式化时间字符串的方法,并列举了常用的时间格式参数。
使用C库的接口
C++可以使用C提供的接口来实现,直接上代码!
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <sstream>
#include <ctime>
int main()
{
time_t t = time(nullptr); // 获取1970年到现在的秒数
struct tm* now = localtime(&t); // 把毫秒转换为日期时间的结构体
std::stringstream timeStr;
// 以下依次把年月日的数据加入到字符串中
timeStr << now->tm_year + 1900 << "年";
timeStr << now->tm_mon + 1 << "月";
timeStr << now->tm_mday << "日 ";
timeStr << now->tm_hour << ":";
timeStr << now->tm_min << ":";
timeStr << now->tm_sec;
std::cout << timeStr.str();
getchar();
return 0;
}
运行效果如下:
使用C++11的标准库
C++ 标准库提供了一些函数来获取当前时间。其中最常用的是 std::chrono::system_clock::now()
函数。它返回当前时间点的时间戳,以自 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数和纳秒数的组合形式表示。
以下是一个使用 std::chrono::system_clock::now()
函数获取当前时间戳并打印的示例代码:
#include <iostream>
#include <chrono>
int main()
{
auto now = std::chrono::system_clock::now();
auto timestamp = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count();
std::cout << "Current timestamp: " << timestamp << std::endl;
return 0;
}
在上面的代码中,我们使用 std::chrono::duration_cast
函数将时间戳转换为秒数,并使用 std::cout
输出到控制台。
除了使用 std::chrono::system_clock::now()
函数外,还可以使用 std::time()
函数来获取当前时间。这个函数返回从 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数。与 std::chrono::system_clock::now()
函数不同,std::time()
函数返回的是 std::time_t
类型的值。
以下是一个使用 std::time()
函数获取当前时间戳并打印的示例代码:
#include <iostream>
#include <ctime>
int main()
{
std::time_t now = std::time(nullptr);
std::cout << "Current timestamp: " << now << std::endl;
return 0;
}
输出:
在上面的代码中,我们使用 std::time(nullptr)
函数获取当前时间戳,并使用 std::cout
输出到控制台。
在使用以上方法获取当前时间时,请确保包含相关的头文件,并使用正确的命名空间。
C库的结构体解释
其他
当然像上面那样可以自己控制每个变量,但还是不够优雅,获得一个时间需要这么多的参数吗?当然不是,前人早就替我们写好了函数,除了直接使用结构体的变量之外,还可以使用函数strftime来格式化tm为字符串。
time_t t = time(nullptr);
struct tm* now = localtime(&t);
char str[50];
strftime(str, sizeof(str), "%Y年%m月%d日 %H:%M:%S", now);
std::cout << str << std::endl;
return 0;
效果如下
strftime的第三个参数就是时间格式,可以自己修改,具体的参数如下:
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的前两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
strftime的参数看起来很长,如果想快一点就是用asctime,会返回英文格式的字符串
time_t t = time(nullptr);
struct tm* now = localtime(&t);
std::cout << asctime(now) << std::endl;
return 0;
我又写了一篇文章从Nginx源码学习如何获取时间
从Nginx学习如何获取时间_强里秋千墙外道的博客-CSDN博客
引用
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)