我正在用C++构建一个应用程序,在这个应用程序中,我需要时间对象来提供对当前系统时间的访问。为此,我使用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的正确方式吗?如果不是,应该如何使用它(例如,在这样的构造函数中)来在不同的系统中正常工作?
Clarification:目前,我对time.h的任何替代方案都不感兴趣。
发布于 2017-09-16 22:47:34
您的代码应该是简单的:
Time::Time()
{
time_t rawTime = time(nullptr);
struct tm* timeInfo = localtime(&rawTime);
m_hours = timeInfo->tm_hour;
m_minutes = timeInfo->tm_min;
m_seconds = timeInfo->tm_sec;
}找出“现在”是什么时候并不要求你告诉机器DST是开着还是关着。它已经知道了。
P.S.:您的代码是线程--毫无原因地不安全--使用localtime_r()来修复这个问题。
https://stackoverflow.com/questions/46258930
复制相似问题