gpt4 book ai didi

c++ - 使用 std::get_time 将时间字符串转换为 std::time_t:错误结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:28 24 4
gpt4 key购买 nike

我正在尝试按时间顺序对照片进行排序。因此,我从 EXIF 数据中将时间提取为字符串,然后将其转换为 std::time_t。但是我有时会得到不正确的结果。我已将问题简化为这个最小的例子。它具有三个时间字符串,相隔一秒:

#include <vector>
#include <string>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <sstream>

int main()
{
std::vector<std::string> vec;

vec.push_back("2016:07:30 09:27:06");
vec.push_back("2016:07:30 09:27:07");
vec.push_back("2016:07:30 09:27:08");

for ( auto & i : vec )
{
struct std::tm tm;
std::istringstream iss;
iss.str(i);
iss >> std::get_time(&tm,"%Y:%m:%d %H:%M:%S");

std::time_t time = mktime(&tm);

std::cout << i << " time = " << time << std::endl;
}
}

使用 clang++ -std=c++14 test.cpp 编译。

输出:

2016:07:30 09:27:06 time = 1469867226
2016:07:30 09:27:07 time = 1469863627
2016:07:30 09:27:08 time = 1469863628

哪一个显然是错误的,它们应该相隔1,只有后两个才是正确的?

Edit

Since there seems to be a bug in clang's std::get_time (and std::put_time), here is my version information:

$ clang --version
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

最佳答案

Here is another library you could use解决该错误。而且这个库是可移植的。如果您有任何问题,我会在数小时内解决。它只是一个标题,没有源代码,因此非常容易“安装”。只需将 header 放在您的包含路径中的某个位置:

#include "date.h"
#include <vector>
#include <string>
#include <iostream>
#include <sstream>

int main()
{
std::vector<std::string> vec;

vec.push_back("2016:07:30 09:27:06");
vec.push_back("2016:07:30 09:27:07");
vec.push_back("2016:07:30 09:27:08");

for ( auto & i : vec )
{
date::sys_seconds tm;
std::istringstream iss{i};
iss >> date::parse("%Y:%m:%d %H:%M:%S", tm);

std::cout << i << " time = " << tm.time_since_epoch().count() << std::endl;
std::cout << date::format("%Y:%m:%d %H:%M:%S\n", tm);
}
}

输出:

2016:07:30 09:27:06 time = 1469870826
2016:07:30 09:27:06
2016:07:30 09:27:07 time = 1469870827
2016:07:30 09:27:07
2016:07:30 09:27:08 time = 1469870828
2016:07:30 09:27:08

关于c++ - 使用 std::get_time 将时间字符串转换为 std::time_t:错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46031765/

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