C++ 将日期转换为c+中的unix时间戳+;
正如一些转换unix时间戳的网站所说,时间戳C++ 将日期转换为c+中的unix时间戳+;,c++,unix,timestamp,C++,Unix,Timestamp,正如一些转换unix时间戳的网站所说,时间戳 2013/05/07 05:01:00 (yyyy/mm/dd, hh:mm:ss) is 1367902860. 就像我在C++中那样,邮票不同于日期。 代码如下: time_t rawtime; struct tm * timeinfo; int year=2013, month=5, day=7, hour = 5, min = 1, sec = 0; /* get current timeinfo: */ time ( &raw
2013/05/07 05:01:00 (yyyy/mm/dd, hh:mm:ss) is 1367902860.
就像我在C++中那样,邮票不同于日期。
代码如下:
time_t rawtime;
struct tm * timeinfo;
int year=2013, month=5, day=7, hour = 5, min = 1, sec = 0;
/* get current timeinfo: */
time ( &rawtime ); //or: rawtime = time(0);
/* convert to struct: */
timeinfo = localtime ( &rawtime );
/* now modify the timeinfo to the given date: */
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1; //months since January - [0,11]
timeinfo->tm_mday = day; //day of the month - [1,31]
timeinfo->tm_hour = hour; //hours since midnight - [0,23]
timeinfo->tm_min = min; //minutes after the hour - [0,59]
timeinfo->tm_sec = sec; //seconds after the minute - [0,59]
/* call mktime: create unix time stamp from timeinfo struct */
date = mktime ( timeinfo );
printf ("Until the given date, since 1970/01/01 %i seconds have passed.\n", date);
生成的时间戳是
1367899260, but not 1367902860.
这里有什么问题?即使我更改为小时-1或小时+1,它也不匹配。编辑:是的,如果我加上1小时,它就可以工作了。以前还添加了1到分钟。mktime()
将local日历时间转换为time\t
对象中的历元时间,因此如果您位于不同的时区,您的结果将与网站的不同。网站将2013/05/07 05:01:00
作为UTC时间。我机器上的相同代码产生的结果是1367874060
,距离网站价值8小时。我在UTC+8:00时区,因此我机器上的mktime()
将输入2013/05/07 05:01:00
作为UTC+8:00时间,从而导致差异
PS:
localtime()
返回指向静态内部struct tm
对象的指针。该结构可以在gmtime()
、localtime()
和ctime()
之间共享,并且可以在每次调用时覆盖。因此,最好是拥有自己的struct tm
对象的本地副本。不要使用指向localtime的指针。保存实际值
struct tm timeinfo;
...
timeinfo = *localtime(&rawtime);
...
date = mktime(&timeinfo);
您不知道localtime返回的指针还可能在使用什么。mktime可能正在使用它。网站似乎假设时间在UTC时区,而您的计算机设置为其他时区 您可以调用
gmtime
而不是localtime
来使用UTC;但我刚刚注意到,除了获取指向tm
的指针之外,您实际上没有使用localtime
执行任何操作。您最好声明一个本地tm
;无论何时调用另一个时间库函数,都可以重用localtime
使用的时间
不幸的是,使用UTC时没有标准的mktime
。如果需要UTC,您可以选择:
- 使用
setenv(“TZ”,“1”)设置时区代码>。请注意,这会影响整个程序,因此如果您还需要处理本地时间,则可能会很尴尬
- 使用像Boost.DateTime这样的库,它在处理日期和时区方面比C库稍好一些
好主意,但它没有改变任何东西。我已更改为
timeinfo=gmtime(&rawtime)代码>结果相同。@是的,代码< MKTIME> /COD>仍然会假定本地时间,并且没有UTC版本。C++中没有TimGM。@ MXMLNKN在C++ STL中有<代码> MKTIME()/<代码>,是吗?!亚历克西斯·威尔克:是的。。。小心timegm
与gmtime
相比。