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博客
引用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具