gpt4 book ai didi

c++ - 以编程方式检查年份是否更改的最有效方法是什么

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:02 27 4
gpt4 key购买 nike

我正在尝试从 NIC 捕获数据包并将部分数据包有效负载保存为字符串。

数据包中必须存储的部分是其日志时间,称为 SysLog。每个数据包都有一个格式如下的系统日志:

Nov 01 03 14:50:25 TCP...[other parts of packet Payload]

可以看出,SysLog包没有Year Number。我的程序肯定是全年运行的,所以我需要在数据包SysLog中添加Year Number,并将SysLog转换为纪元时间。我必须存储的最终字符串是这样的:

1478175389-TCP, ….

我使用以下代码将 Syslog 转换为 EpochTime。

tm* tm_date = new tm();
Std ::string time = Current_Year;
time += " ";
time += packet.substr(0,18);
strptime(time.c_str(), "%Y %b %d %T", tm_date);
EpochTime = timegm(tm_date);

currentYear 方法:

std::string    currentYear() {
std::stringstream now;
auto tp = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
size_t modulo = ms.count() % 1000;
time_t seconds = std::chrono::duration_cast<std::chrono::seconds>(ms).count();
#if HAS_STD_PUT_TIME
#else
char buffer[25]; // holds "2013-12-01 21:31:42"
if (strftime(buffer, 25, "%Y", localtime(&seconds))) {
now << buffer;
}
#endif // HAS_STD_PUT_TIME
return now.str();
}

以上操作是我必须对每个数据包做的。数据包速率为 100000-1000000 pps,上面的和平代码非常耗时,特别是在 currentYear() 上。一种可能的优化是删除 currentYear() 方法并保存年份数作为常量值。如前所述,我的计划必须全年运行,如您所知,2017 年即将到来。我们不能在 31/12/2016 23:59:00 更改我们的二进制文件,我们也不想浪费我们的时间来计算年号!!

我需要一种更有效的方法来计算当前年份数字,而无需为每个数据包运行它。

这可能吗?你对我有什么建议?

最佳答案

获得当前日期和时间后,据此计算下一个 1 月 1 日午夜的纪元时间应该不会太困难。

在计算出这一年的预期纪元时间后,您要做的就是在创建日志条目时将其与当前时间进行比较。如果它还没有到达预先计算的 1 月 1 日午夜时间,您就知道这一年还没有结束。

因此,您根本不需要为每个数据包计算年份。只需要检查当前时间与预先计算的 1 月 1 日午夜时间,除非政客决定更改您的时区,否则不应更改,而所有这些都在运行...

关于c++ - 以编程方式检查年份是否更改的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40403191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com