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

标签 c++ c++11 time sniffing

我正在尝试从 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/

相关文章:

c++ - 如何在函数重载决议中转储候选人?

android - 如何找到进行数学运算所花费的时间?

c++ - 按偏移量查找成员

java - 托管语言是否锁定刷新并重新加载 native 库的变量?

c++ - C/C++ - 预编译 header - 封装、如何以及为什么需要配置?

c++ - constexpr c 字符串连接,在 constexpr 上下文中使用的参数

c++ - 编译器优化

c++ - 为什么nullptr不需要标题,而nullptr_t却需要

ios - 如何在iOS中找到线程状态?

c - 在每个循环中用不同的种子在 C 中生成随机数?