简体   繁体   中英

Convert time_t to string and string to time_t gives wrong year and an hour

I'm trying and trying to write functions to help myself easily convert string to time_t and time_t to string . However, it always gives me wrong a year and a wrong hour. What's wrong?

I need it to be OS independent!

For instance, for date 30/11/2012:09:49:55 it gives 30/11/3912:08:49:55 instead of 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;
}

the tm_year in the structure std::tm keeps the years since 1900 .

Thus, instead of when.tm_year = yy; its necessary to subtract 1900 from the year: when.tm_year = yy-1900;

You can check the code running here .

Edit: as sfjac pointed out, my answer wasnt addressing the DST problem.

The problem with the hour is the DST flag. Since I can't reproduce the problem on ideone, only locally.. the system may be setting the tm_isdst based on local settings .

You will need to set the when.tm_isdst to 0 or negative, depending on what you want. Set to 0 if you know the datetime doesnt have DST, -1 (negative) if it is unknown.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM