gpt4 book ai didi

c++ - 将 time_t 转换为字符串,将字符串转换为 time_t 会给出错误的年份和小时

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

我正在尝试编写函数来帮助自己轻松地将 string 转换为 time_t 并将 time_t 转换为 string。然而,它总是给我错误的一年和一个错误的时间。怎么了?

我需要它独立于操作系统!

例如,对于日期 30/11/2012:09:49:55,它给出 30/11/3912:08:49:55 而不是 30/11/2012:09:49:55

#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;

time_t string_to_time_t(string s)
{
int yy, mm, dd, hour, min, sec;
struct tm when;
long tme;

memset(&when, 0, sizeof(struct tm));
sscanf(s.c_str(), "%d/%d/%d:%d:%d:%d", &dd, &mm, &yy, &hour, &min, &sec);

time(&tme);
when = *localtime(&tme);
when.tm_year = yy;
when.tm_mon = mm-1;
when.tm_mday = dd;
when.tm_hour = hour;
when.tm_min = min;
when.tm_sec = sec;

return mktime(&when);
}

string time_t_to_string(time_t t)
{
char buff[20];
strftime(buff, 20, "%d/%m/%Y:%H:%M:%S", localtime(&t));
string s(buff);
return s;
}

int main()
{
string s = "30/11/2012:13:49:55";

time_t t = string_to_time_t(s);
string ss = time_t_to_string(t);

cout << ss << "\n";


return 0;
}

最佳答案

结构std::tm 中的tm_year 保留自1900 以来的年份。 .

因此,需要从年份中减去 1900 而不是 when.tm_year = yy;:when.tm_year = yy-1900;

您可以检查运行的代码 here .

编辑:正如 sfjac 所指出的,我的回答并未解决 DST 问题。

小时的问题是 DST 标志。由于我无法在 ideone 上重现该问题,只能在本地重现。系统可能正在根据 local settings 设置 tm_isdst .

您需要将 when.tm_isdst 设置为 0 或负数,具体取决于您的需要。如果您知道日期时间没有 DST,则设置为 0,如果不知道则设置为 -1(负)。

关于c++ - 将 time_t 转换为字符串,将字符串转换为 time_t 会给出错误的年份和小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764160/

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