【发布时间】:2018-02-25 18:55:51
【问题描述】:
我正在用 C++ 构建一个应用程序,我需要 Time 对象来访问当前系统时间。为此,我使用time.h。我的两个构造函数如下:
Time::Time(bool p_daylightSavingEnabled /* = true */)
{
time_t rawTime = time(nullptr);
struct tm* timeInfo = localtime(&rawTime);
timeInfo->tm_isdst = static_cast<int>(p_daylightSavingEnabled);
m_hours = timeInfo->tm_hour;
m_minutes = timeInfo->tm_min;
m_seconds = timeInfo->tm_sec;
}
除了使用我添加的tm_isdst 标志之外,一切都非常简单,因为当时间改变时单元测试会失败,但对我来说仍然很神秘。我在 Internet 上没有找到关于如何正确使用此标志的明确文档,而且我听说在某些系统上,它甚至不可用(即设置为 0)。
这是使用tm_isdst 的正确方法吗?如果不是,应该如何使用它(例如在这样的构造函数中)以在不同系统中正常工作?
澄清:目前,我对time.h 的任何替代品不感兴趣。
【问题讨论】:
-
否;你应该看看
localtime返回什么;您不应该假装它可以在没有更多补偿性更改的情况下被忽略/覆盖。是的,一般来说,它是不明确的。 -
@JonathanLeffler 你不应该假装它可以在没有更多补偿性变化的情况下被忽略/覆盖。你所说的更多补偿性变化是什么意思?你有我可以看的例子吗?
-
localtime的手册页充分解释了is_dst的含义。如果在localtime手册页中对该字段的描述有不清楚的地方,您应该解释您不清楚的地方。 -
“不”很容易。解释不是。您需要探索您使用的系统实际做了什么——使用变量设置
rawTime而不是time()。我将浏览我的代码集,看看我是否可以在一个 MCVE 大小的示例中展示我的担忧。 -
你不能仅仅改变结构中的一个值并期望其他值因此而改变,而不可能调用另一个函数来为你这样做。但在这种情况下,结构的成员是信息性的;它们是供您阅读的,而不是供您书写的。