使用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);

thennow都指向同一个object!所以你丢失了第一次调用 go gmtime 的信息,它被第二次调用覆盖了!

MSVC 试图通过默认不允许使用 gmtime 来避免这种错误。要关闭 warning/error,您需要使用错误中显示的宏:_CRT_SECURE_NO_WARNINGS。在包含 header 之前在开始处 #define 它,或者在 IDE 的项目设置中将其添加为 pre-processor 定义。

旁注:正确解决您的错误:

tm then = *gmtime(&startTime);
tm now = *gmtime(&eventTime);