【问题标题】:Comparing time_t values using comparison operators使用比较运算符比较 time_t 值
【发布时间】:2023-03-26 00:00:01
【问题描述】:

我有 2 个time_t 值,我想找出哪个更大。

time_t 在我的平台上内部是__int64。我可以使用<>== 运算符来比较这些值吗? 我不想知道这两个时间值的区别。

代码只会在 Windows 上运行,所以我不关心可移植性。

这样比较值是否正确?

【问题讨论】:

  • 如果您不关心可移植性并且知道time_t 在内部是__int64,那么问题的意义何在? __int64 值当然可以与比较运算符进行比较。
  • 在问这个问题之前你谷歌了time_t吗?我做到了。 This 是第一个结果。它告诉了我所有我需要知道的。请在提出有关 SO 的问题之前进行研究。
  • @anthropomorphic 我已经看过那个页面,但我特意想问这个,因为那个页面没有像下面的技术人员解释得那么多..

标签: c++ windows time time-t


【解决方案1】:

根据 C 标准的第 7.27.1(3) 部分(在这种情况下 C++ 标准指代)time_t 是一个实类型,它在 6.2.5(17) 中定义为整数或浮点类型。

只要您不明确假设可能会丢失精度的整数(即通过 time_t t; int x = t;),您就是安全的。

编辑: 我实际上收回了这一点。如果你去this link, post #6,你可以阅读以下内容:

仅仅因为 time_t 是算术,并不意味着它存储时间 作为推进时间的单调递增值。事实上,我们的标准 对于晚于 t1 的 t2,C 库不保证 t1

P.J.普劳格
Dinkumware, Ltd.
http://www.dinkumware.com

由于 Dinkumware 在 Windows 系统上被广泛使用(虽然我不知道这是否也适用于 C++ 标准库)我认为这是相关的。

tl;dr:按照其他答案中的建议使用std::difftime

【讨论】:

  • 如果 time_t 突然变成结构或数组,可能会有相当多的代码会中断......
  • 是的,查了一下。根据标准,它必须是实数类型,所以你是对的。
  • t0 < t1 是安全的,但标准不保证它是有意义的。看我的回答。
【解决方案2】:

C 标准(C++ 继承了 time_t 的定义)只说 time_t 是一种能够表示时间的算术类型。它没有说明如何这样做。原则上,实现可以将time_t 值定义为直到某个未来日期的秒数,或者它可以按该顺序编码月、日、年、小时、分钟和秒。比较 time_t 值可以保证行为一致(例如,t0 < t1 && t1 < t2 暗示 t0 < t2),但比较结果不一定说明所表示的时间顺序。

要 100% 可移植,您可以查看difftime() 的结果。

但是,如果您愿意接受大约 99% 的可移植性,那么您应该可以放心地假设比较按预期工作(t0 < t1 意味着 t0 实时领先于 t1)。我从未听说过不起作用的实现。如果不合格,你可以向实施者投诉,但不能说他们没有确认标准。

【讨论】:

    【解决方案3】:

    是的,您可以在有限的情况下使用普通的比较运算符。可能有其他系统不起作用,但现代 Linux 和 Windows 操作系统可以很好地比较 time_t 值。

    【讨论】:

    • 根据电影人编辑的答案所引用的标准(讽刺地由您的评论提示),匹配 time_t 值应该始终有效。这使得在这个答案中声称“可能有其他系统不起作用”是不正确的。
    • @user4815162342:取决于你所说的“工作”;看我的回答。
    • @KeithThompson 很好,+1。奇怪和令人惊讶的是,该标准允许实现使用 time_t 作为自纪元以来的时间单位计数以外的东西,但在 C99 的 7.23.2.4#2 和 C89 的 4.2.12.4 中的措辞很明确:未指定值的编码。
    【解决方案4】:

    假设time_t 对您的用例有足够高的分辨率,那么可以。如果您需要更高的分辨率并且 Windows 是您唯一关心的问题,请考虑切换到处理 FILETIME 类型的 Win32 函数。

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2012-10-05
      • 2021-01-20
      • 2022-06-18
      相关资源
      最近更新 更多