[英]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。
当你来自时,你有夏令时吗? 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);
。 请注意,这会影响整个程序,因此如果您还需要处理本地时间,可能会很尴尬。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.