繁体   English   中英

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

[英]Convert date to unix time stamp in 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到几分钟。

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

在C / C ++中在本地时间和GMT / UTC之间转换

当你来自时,你有夏令时吗? 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/

mktime()本地日历时间转换为自纪元以来的时间作为time_t对象,因此如果您位于不同的时区,则结果将与网站的结果不同。 该网站以UTC时间2013/05/07 05:01:00为准。 我的机器上的相同代码的结果为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; 但我刚刚注意到你实际上并没有使用localtime来做任何事情,除了得到指向tm的指针。 你最好宣布一个当地的tm ; 每当你调用另一个时间库函数时, localtime使用的那个可以被重用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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