小编cha*_*a22的帖子

将带有时区的日期时间字符串转换为C ++中的UNIX时间戳的快速方法

我想将一个大的包含日期时间字符串的文件转换为自C ++的UNIX时代(1970年1月1日)以来的秒数。我需要计算速度非常快,因为我需要处理大量的日期时间。

到目前为止,我已经尝试了两种选择。首先是使用在中定义的mktime time.h。我尝试的第二个选项是Howard Hinnant的带时区扩展的日期库

这是我用来比较mktime和Howard Hinnant的tz的性能的代码:

for( int i=0; i<RUNS; i++){
    genrandomdate(&time_str);

    time_t t = mktime(&time_str);

}

auto tz = current_zone()
for( int i=0; i<RUNS; i++){

    genrandomdate(&time_str);
    auto ymd = year{time_str.tm_year+1900}/(time_str.tm_mon+1)/time_str.tm_mday;
    auto tcurr = make_zoned(tz, local_days{ymd} + 
            seconds{time_str.tm_hour*3600 + time_str.tm_min*60 + time_str.tm_sec}, choose::earliest);
    auto tbase = make_zoned("UTC", local_days{January/1/1970});
    auto dp = tcurr.get_sys_time() - tbase.get_sys_time() + 0s;

}
Run Code Online (Sandbox Code Playgroud)

比较结果:

time for mktime : 0.000142s
time for tz : 0.018748s
Run Code Online (Sandbox Code Playgroud)

与mktime相比,tz的性能不好。我想要比mktime更快的东西,因为当重复用于大量迭代时,mktime也非常慢。Java Calendar提供了一种非常快速的方法来执行此操作,但是当时区也在起作用时,我不知道有任何C ++替代方法。

注意:在没有时区的情况下,Howard Hinnant的日期可以非常快速地工作(甚至超过Java)。但这还不足以满足我的要求。

c++ datetime date mktime c++20

6
推荐指数
2
解决办法
245
查看次数

标签 统计

c++ ×1

c++20 ×1

date ×1

datetime ×1

mktime ×1