2014-02-10 207 views
3

至于一些网站,这些转换UNIX时间戳说的转换日期在C++ 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 (&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分钟。

回答

0

mktime()本地日历时间转换为纪元以来的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对象。

0

不要使用指向localtime的指针。保存实际值

struct tm timeinfo; 
... 
timeinfo = *localtime(&rawtime); 
... 
date = mktime(&timeinfo); 

您不知道还有什么可以使用localtime返回的指针。 mktime可能会使用它。

+0

不错的想法,但它不会改变任何东西。 – user2366975

0

它看起来像网站假设时间在UTC时区,并且您的计算机设置为其他时区。

您可以拨打gmtime而不是localtime来使用UTC;但我刚刚注意到您实际上并未使用localtime来执行任何操作,除非获得指向tm的指针。你最好宣布本地tm;当调用另一个时间库函数时,localtime使用的那个可以被重用。

不幸的是,没有使用UTC的mktime的标准变体。如果你想要UTC,你的选择是:

  • 使用setenv("TZ", "", 1);设置时区。请注意,这会影响整个程序,因此如果您还需要处理当地时间,可能会很尴尬。
  • 使用像Boost.DateTime这样的库,在处理日期和时区上比C库稍好。
+0

我已经更改为'timeinfo = gmtime(&rawtime);'并且结果保持不变。 – user2366975

+0

@ user2366975:哦,是的,'mktime'仍然会假设当地时间,并且没有UTC版本。 –

1

您是否有夏令时? tm :: tm_isdst参数是夏令时的标志。当地时间呼叫会根据您的位置和一年的时间填写,而您不会重置。因此,即使您和网页同时使用,如果您设置了夏令时标志并且网页没有,那么您最终会在1小时内结束。

请注意,您并不需要localtime调用。您可以手动填写所有部分,因为tm :: tm_wday和tm :: tm_yday会被mktime忽略。退房http://www.cplusplus.com/reference/ctime/tm/http://www.cplusplus.com/reference/ctime/mktime/