【问题标题】:Does c++ time difference function calculate daylight savings?c++时差函数是否计算夏令时?
【发布时间】:2013-01-20 13:06:18
【问题描述】:

如果我使用 C++ 时差 (timediff) 函数来计算 2 次之间的差异,而后面的时间是在夏令时的时间更改之后,返回的差异会计算这个。

例如我的时间是 23:00,时间是 11:00。时间在这个时间中间发生变化,即向前一小时。

我会得到 12 小时还是 11 小时的差异?

【问题讨论】:

  • 我找不到任何名为 timediff 的函数,你能显示代码吗?如果您的意思是 Cs difftime,那么这两个参数都是 time_t(自纪元以来的秒数),因此在那里谈论任何时区/dst 没有意义
  • cplusplus.com/reference/ctime/difftime 看来问题归结为数据问题。

标签: c++ time.h


【解决方案1】:

函数是difftime,而不是timediff。而且需要两个 time_t 作为参数; time_t 通常代表 UTC,而不是 特定的当地时间,因此不会出现夏令时问题。

【讨论】:

  • 它不是“典型地代表UTC”,它通常代表自纪元以来的秒数,即自特定时间点以来经过的秒数。仅当您尝试将秒数转换为包含天数、小时数等的表示时,时区才会参与其中。
  • @PlasmaHH 因为纪元是用 UTC 指定的,所以它表示它的时间是 UTC。从形式上讲,您说得很对,但我说的是更笼统的方式:我们使用time_t 表示时间(例如,文件的最后修改时间),以及何时表示时间(因为我们也可以用它来表示和间隔),那个时间就是UTC。表示实际上是从特定时间点开始的间隔这一事实或多或少是一个实现细节。 (当然,在我们将其用作时间的情况下。)
  • 我发现将其视为实现细节的想法确实让人们感到困惑。他们开始做一些事情,比如想要将 time_t 从 UTC 转换为他们的时区,或类似的事情。虽然正式规范引用 UTC 是正确的(也许 00:00 1.1.1970 更容易记住),但当您在时区中指定纪元时,SSE 的值没有区别。因此,我通常坚持 SSE 是“少时区”,并发现这对人们来说更容易理解,因为即使没有任何时区,SSE 也具有真正的含义。
  • 为了迂腐,time_t 不是时间点,而是自众所周知的时间点(纪元)以来经过的持续时间。 epoch + time_t 产生一个时间点。然而,标准 C 时间函数假定一个硬编码的纪元。
  • @PlasmaHH:真正让我感到困惑的是,为什么会有一个库函数来处理return (a - b) >= 0 ? (a-b) : -(a-b);(或类似的东西)这样的小事。大多数时候你都知道a >= b,所以你可以写a-b。库函数的存在确实暗示(错误地)它执行某种复杂的时区/dst 计算,而不是简单的减法。
【解决方案2】:

是的,你会的。在 Y2k 的日子里,我不得不在 Visual Studio 6 中处理它。然后他们更改了使代码无效的 DST 规则。

如果您看到向前一小时和向后一小时的神秘跳跃,那就是 DST 在 RTL 中抬起丑陋的头。

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2015-02-06
    • 2013-11-24
    • 1970-01-01
    • 2022-12-10
    • 2016-08-02
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多