用c ++将日期转换为unix时间戳

时间:2014-02-10 13:52:20

标签: 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 ( &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分钟。

5 个答案:

答案 0 :(得分:3)

你必须使用timegm()而不是mktime(),这就是全部。因为mktime用于UTC / GMT时间的本地时间和timegm。

Converting Between Local Times and GMT/UTC in C/C++

答案 1 :(得分:1)

当你来自时,你有夏令时吗? tm :: tm_isdst参数是夏令时的标志。这将根据您所在的位置和一年中的时间通过本地时间呼叫填写,您不会重置它。因此,即使你和网页都在同一时间使用,如果你设置了夏令时标志并且网页没有,那么你最终会有1小时不同。

请注意,您并不需要本地电话。您可以手动填写所有部分,因为mktime会忽略tm :: tm_wday和tm :: tm_yday。查看http://www.cplusplus.com/reference/ctime/tm/http://www.cplusplus.com/reference/ctime/mktime/

答案 2 :(得分: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对象的本地副本是一种更好的做法。

答案 3 :(得分:0)

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

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

你不知道还有什么东西可能正在使用localtime返回的指针。 mktime可能正在使用它。

答案 4 :(得分:0)

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

您可以拨打gmtime而不是localtime来使用UTC;但是我注意到你实际上并没有使用localtime来做任何事情,除了得到指向tm的指针。你最好宣布一个本地的tm;每当你调用另一个时间库函数时,localtime使用的那个都可以被重用。

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

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