gpt4 book ai didi

c++ - 当时间字符串使用 “PM”字段时,如何与std::put_time std::get_time始终往返?

转载 作者:行者123 更新时间:2023-12-02 10:11:09 27 4
gpt4 key购买 nike

编辑:初始化tmb.tm_isdst为0
我在解析带有“AM” /“PM”字段的日期时遇到问题。通常,无论我使用哪种转换说明符组合,它似乎都会忽略此字段。有时似乎是随机解析时间。
我解析的示例日期是

08/22/2020 10:16:57 PM
我正在使用 "en_US.utf-8"语言环境和以下转换说明符字符串:
"%x %I:%M:%S %p" //ignores AM/PM
"%x %X" // hour gets a random number and minutes/seconds equal 0
"%x %r" // hour gets a random number and minutes/seconds equal 0
我已经尝试了x86-64 GCC 5到10和x86-64 clang 3.4.1到10。
以下是无法进行往返( live code w/ godbot)的示例代码:
#include <sstream>
#include <locale>
#include <iomanip>

int main(){
std::time_t t = 1598134617;
std::tm tm = *std::localtime(&t);
std::stringstream ss;
ss.imbue(std::locale("en_US.utf-8"));
ss << std::put_time(&tm, "%x %I:%M:%S %p");

std::cout << ss.str() << std::endl;

std::tm tmb;
ss >> std::get_time(&tmb,"%x %I:%M:%S %p");
tmb.tm_isdst = 0;
std::cout << "years since 1900:\t" << tmb.tm_year << std::endl;
std::cout << "month:\t\t\t" << tmb.tm_mon << std::endl;
std::cout << "day:\t\t\t" << tmb.tm_mday << std::endl;
std::cout << "hour:\t\t\t" << tmb.tm_hour << std::endl;
std::cout << "mins:\t\t\t" << tmb.tm_min << std::endl;
std::cout << "secs:\t\t\t" << tmb.tm_sec << std::endl;
std::cout << "dst:\t\t\t" << tmb.tm_isdst << std::endl;
std::cout << "timestamp:\t\t" << (mktime(&tmb));
}
此代码输出了错误的时间戳,由于未解析“PM”字段,因此往返失败。
时间戳记应为1598134617;打印1598091417:
08/22/2020 10:16:57 PM
years since 1900: 120
month: 7
day: 22
hour: 10
mins: 16
secs: 57
dst: 0
timestamp: 1598091417
关于如何在c++中一致地解析“AM” /“PM”字段的任何想法?

最佳答案

使用clang时,请将其添加到命令行:-stdlib=libc++。这使用了std::get_timestd::put_time函数的llvm实现。

关于c++ - 当时间字符串使用 “PM”字段时,如何与std::put_time std::get_time始终往返?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63532296/

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