Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将日期转换为c+中的unix时间戳+;_C++_Unix_Timestamp - Fatal编程技术网

C++ 将日期转换为c+中的unix时间戳+;

C++ 将日期转换为c+中的unix时间戳+;,c++,unix,timestamp,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 ( &raw

正如一些转换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到分钟。

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

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

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

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

网站似乎假设时间在UTC时区,而您的计算机设置为其他时区

您可以调用
gmtime
而不是
localtime
来使用UTC;但我刚刚注意到,除了获取指向
tm
的指针之外,您实际上没有使用
localtime
执行任何操作。您最好声明一个本地
tm
;无论何时调用另一个时间库函数,都可以重用
localtime
使用的时间

不幸的是,使用UTC时没有标准的
mktime
。如果需要UTC,您可以选择:

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

当你从英国来时,你有夏令时吗?tm::tm_isdst参数是夏令时的标志。这将由localtime调用根据您所在的位置和一年中的时间进行填充,而您不会重置它。因此,即使您和网页同时使用,如果您设置了夏令时标志,而网页没有设置夏令时标志,那么您最终会相差1小时

注意,您实际上并不需要localtime调用。您可以手动填写所有部分,因为mktime会忽略tm::tm_wday和tm::tm_yday。签出并

您必须使用timegm()而不是mktime(),仅此而已。因为mktime表示本地时间,timegm表示UTC/GMT时间


好主意,但它没有改变任何东西。我已更改为
timeinfo=gmtime(&rawtime)结果相同。@是的,代码< MKTIME> /COD>仍然会假定本地时间,并且没有UTC版本。C++中没有TimGM。@ MXMLNKN在C++ STL中有<代码> MKTIME()/<代码>,是吗?!亚历克西斯·威尔克:是的。。。小心
timegm
gmtime
相比。