【问题标题】:Is this a correct way to use the struct tm 'tm_isdst' flag这是使用 struct tm 'tm_isdst' 标志的正确方法吗
【发布时间】: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 大小的示例中展示我的担忧。
  • 你不能仅仅改变结构中的一个值并期望其他值因此而改变,而不可能调用另一个函数来为你这样做。但在这种情况下,结构的成员是信息性的;它们是供您阅读的,而不是供您书写的。

标签: c++ ctime time.h


【解决方案1】:

您的代码应该是:

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() 来解决此问题。

【讨论】:

  • @johnswinck 如果我理解正确,如果我不处理 DST 标志并且我的系统支持夏令时,它应该自己知道何时更改时间(并更改它)?换句话说,DST 标志在读取时只是告诉程序员系统是否支持夏令时?
  • 夏令时标志仅用于通知您系统当前是否处于夏令时。系统自己知道何时更改 DST 时间。
猜你喜欢
  • 2016-07-02
  • 2012-05-11
  • 2018-12-31
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多