Converting date string to timestamp

Jan 26, 2016 at 4:04pm
This is my attempt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <time.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>

long gettimezone(){
	TIME_ZONE_INFORMATION tzinfo;
	GetTimeZoneInformation(&tzinfo);
	return tzinfo.Bias;
}

unsigned long tsfstr(std::string datetime="1970.01.01 00:00:00"){
	if(datetime.length()<19){std::cout<<"invalid string - cant convert to timestamp"; _getch();}
	struct tm tm;
	tm.tm_year=atoi(datetime.substr(0,4).c_str())-1900;
	tm.tm_mon=atoi(datetime.substr(5, 2).c_str())-1;
	tm.tm_mday=atoi(datetime.substr(8, 2).c_str());
	tm.tm_hour=atoi(datetime.substr(11, 2).c_str());
	tm.tm_min=atoi(datetime.substr(14, 2).c_str());
	tm.tm_sec=atoi(datetime.substr(17, 2).c_str());
	
	char buff[80];
	strftime(buff, 80, "%Y.%m.%d %H:%M:%S", &tm);
	std::cout<<"should be: "<<std::string(buff)<<"\n";

	return mktime(&tm);	
}

int main(){
	std::cout<<tsfstr("2010.01.31 00:00:00");
	_getch();
}


Output:
should be: 2010.01.31 00:00:00
1264910400


Apparently 1264910400 is 2010.01.31 04:00:00 UTC though
Last edited on Jan 26, 2016 at 4:05pm
Jan 26, 2016 at 5:01pm
Do you have a question or problem?
Jan 26, 2016 at 5:13pm
Well, I was expecting 1264896000 / 2010.01.31 00:00:00 UTC. Where's the error in my conversion?
Jan 26, 2016 at 5:45pm
It looks like you didn't take into account that tm_hour is the number of hours from midnight.

You may want to reverse your calculation with a call to localtime() then look at the values of the structure tm to see where the problem lies.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    time_t value = tsfstr("2010.01.31 00:00:00");
    std::cout << value << endl;

    struct tm * timeinfo;

    timeinfo = localtime (&value);
    std::cout << timeinfo->tm_year+1900 << std::endl;
    std::cout << timeinfo->tm_mon + 1 << std::endl;
    std::cout << timeinfo->tm_mday  << std::endl;
    std::cout << timeinfo->tm_hour << std::endl;
    std::cout << timeinfo->tm_min << std::endl;
    std::cout << timeinfo->tm_sec << std::endl;

}

And note, your tsfstr() function should actually be returning a time_t, not an unsigned long.

Jan 29, 2016 at 2:03pm
i thought time_t was typedef'd as unsigned long
easier fix: use _mkgmtime()
Jan 29, 2016 at 3:42pm
i thought time_t was typedef'd as unsigned long

Not necessarily, time_t is in implementation defined unsigned type. While it "could" an unsigned long or it "could" just as well be an unsigned int or an unsigned long long, it depends on the implementation. You should always try to use the correct type, since mktime() returns a time_t, you should use a time_t.


Edit:
easier fix: use _mkgmtime()

That may be fine, just realize that that function is not a standard C or C++ function, it is an implementation defined function that may not be available with all compilers.
Last edited on Jan 29, 2016 at 4:04pm
Topic archived. No new replies allowed.