使用gmtime和mktime在同一天制作两个time_t值,'function may be unsafe'错误
Making two time_t values the same day using gmtime and mktime, 'function may be unsafe' error
我正在尝试使用过去的 time_t 和新时间,并使用 gmtime,使它们成为我可以将新时间更改为一周中同一天的结构,在此之后,我希望将新更改的时间恢复为time_t和return。
所以我的问题是,作为一个新程序员,我想知道下面的代码是否是正确的方法,如果是这样,为什么我会得到:
""Error 3 error C4996: 'gmtime': This function or variable may be unsafe. Consider using gmtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details." 错误?
代码:
time_t copyStartTime(time_t &startTime,time_t eventTime ) //finds exact time of startTime and returns it
{
cout << eventTime << "\n";
cout << startTime << "\n";
cin.get();
tm* then = gmtime(&startTime);
cout << (then->tm_hour);
tm* now = gmtime(&eventTime);
cout << (now->tm_hour);
cin.get();
then->tm_hour = now->tm_hour;
time_t newTime = _mkgmtime(then);
cout << newTime << "\n";
cin.get();
return newTime;
}
来自 gmtime
documentation:
The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.
好的,这是 linux 文档,但在 windows 上的行为是相同的。
而您 运行 正好遇到以下问题:
tm* then = gmtime(&startTime);
cout << (then->tm_hour);
tm* now = gmtime(&eventTime);
then
和now
都指向同一个object!所以你丢失了第一次调用 go gmtime
的信息,它被第二次调用覆盖了!
MSVC 试图通过默认不允许使用 gmtime 来避免这种错误。要关闭 warning/error,您需要使用错误中显示的宏:_CRT_SECURE_NO_WARNINGS
。在包含 header 之前在开始处 #define 它,或者在 IDE 的项目设置中将其添加为 pre-processor 定义。
旁注:正确解决您的错误:
tm then = *gmtime(&startTime);
tm now = *gmtime(&eventTime);
我正在尝试使用过去的 time_t 和新时间,并使用 gmtime,使它们成为我可以将新时间更改为一周中同一天的结构,在此之后,我希望将新更改的时间恢复为time_t和return。
所以我的问题是,作为一个新程序员,我想知道下面的代码是否是正确的方法,如果是这样,为什么我会得到:
""Error 3 error C4996: 'gmtime': This function or variable may be unsafe. Consider using gmtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details." 错误?
代码:
time_t copyStartTime(time_t &startTime,time_t eventTime ) //finds exact time of startTime and returns it
{
cout << eventTime << "\n";
cout << startTime << "\n";
cin.get();
tm* then = gmtime(&startTime);
cout << (then->tm_hour);
tm* now = gmtime(&eventTime);
cout << (now->tm_hour);
cin.get();
then->tm_hour = now->tm_hour;
time_t newTime = _mkgmtime(then);
cout << newTime << "\n";
cin.get();
return newTime;
}
来自 gmtime
documentation:
The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.
好的,这是 linux 文档,但在 windows 上的行为是相同的。
而您 运行 正好遇到以下问题:
tm* then = gmtime(&startTime);
cout << (then->tm_hour);
tm* now = gmtime(&eventTime);
then
和now
都指向同一个object!所以你丢失了第一次调用 go gmtime
的信息,它被第二次调用覆盖了!
MSVC 试图通过默认不允许使用 gmtime 来避免这种错误。要关闭 warning/error,您需要使用错误中显示的宏:_CRT_SECURE_NO_WARNINGS
。在包含 header 之前在开始处 #define 它,或者在 IDE 的项目设置中将其添加为 pre-processor 定义。
旁注:正确解决您的错误:
tm then = *gmtime(&startTime);
tm now = *gmtime(&eventTime);