2

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

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

例如,对于 date30/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;
}
4

1 回答 1

2

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

因此,不必when.tm_year = yy;从年份中减去 1900:when.tm_year = yy-1900;

您可以在此处检查运行的代码。

编辑:正如 sfjac 指出的那样,我的回答没有解决 DST 问题。

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

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

于 2015-09-24T15:00:11.070 回答