导读

之前实习的时候,需要实现写日志的功能,日志当然要记录时间了,没想到在网上半天找不到满意的答案,于是自己统计了资料之后写了这篇博文。

我把代码和相关的结果都放在了下面,不搞空的,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博客

引用

strftime_百度百科

time 函数,localtime函数_又肥又壮的韭菜的博客-CSDN博客_localtime

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐