正如一些转换那些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 :(得分:3)
你必须使用timegm()而不是mktime(),这就是全部。因为mktime用于UTC / GMT时间的本地时间和timegm。
答案 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);
设置时区。请注意,这会影响整个程序,因此如果您还需要处理当地时间,可能会很尴尬。