【问题标题】:What is the biggest useful value of time_t?time_t 最大的有用价值是多少?
【发布时间】:2013-02-07 17:23:53
【问题描述】:

要找出time_t 的有效值范围似乎非常困难。

它在一些 32 位平台上,在大多数 64 位平台上,因此可以很容易地设置为 LONG_MAX。但是,尝试使用该值并不能真正正常工作。例如,您不能将其传递给 localtime 并将其更改为 struct tm

一个二进制搜索的快速测试程序告诉我它是 67768036191676799。这对应于 2147483647 年末,因此作为一个值是有意义的。但是,这是在任何地方指定的吗?对于最大可用 time_t,是否有任何合理的、独立于平台的值?

【问题讨论】:

  • 我不相信它是重复的。现有问题都没有引用我关于 time_t 最大可用值的问题?
  • 我们不是正在向 64 位过渡吗?
  • 请记住,即使 time_t 的数值最大,在某些实现中,一些(通常很大的)time_t 也会通过标准函数产生完全乱码,例如本地时间()

标签: c time


【解决方案1】:

确实,time_t 和clock_t 的规范是实现定义的(C99 7.23.1)。

这是我建议不要自己生成这些值的事情之一,而是依靠实现为您创建它们,例如使用mktime(),并使用struct tm 直接操纵时间。 -1 是 time_t 的唯一值,它是您可以自己使用的“好”值。

我特别建议您不要像 jgm 建议的那样将其视为任何类型的 32 位值。你永远不知道某些奇怪的嵌入式编译器是否会使用 16 位时间或 18 位时间,或者谁知道呢。

【讨论】:

    【解决方案2】:

    最安全的使用方式是 32 位签名,只要您对它在 25 年后不再工作感到满意。

    否则,您将不得不在运行的任何平台上自行测试类型并采取相应措施。

    【讨论】:

    • 或者更安全地将其视为 31 位无符号,因为您很可能会看到它是 32 位有符号的实现。
    • 是的,25 年的限制不再合理。我希望现在应该实施适当的解决方案!
    • 是的;你有一个 64 位的值。但是还有很多遗留系统和代码仍然存在。如果您是从头开始构建,那么 64 位值不会有问题,但如果您使用其他库和/或与旧系统集成,则必须检查每个库。好消息是,编写一些测试代码以快速了解它们的处理能力相对容易。
    • @asc99c:确实,您不会认为标准包含 TIME_MAXTIME_MIN 是保证在localtimegmtimemktime 的上下文。唯一的节省是标准声明它是实现定义的,因此实现必须记录它。某处。
    【解决方案3】:

    tm_year 的类型为int,因此如果您要转换为struct tm,最大有意义的time_t 是对应于年份INT_MAX 的值。

    【讨论】:

    • 所以要便携,你必须处理上限是由于 time_t 的最大值的情况以及上限是由于最大值的情况tm_year,但没有任何其他限制来源?是否允许localtime 脱落不是因为tm_year 已溢出,而是因为实施者选择不对闰年做出预测,而是返回null?地球在 20 亿年内不会以几乎相似的速度自转,所以即使人类文明不是,公历也是干杯;-)
    • 是的。 C对于是否/何时允许函数失败非常模糊。 POSIX 将允许它由于实现定义的原因而失败,但实现必须选择一个新的、适当的错误代码;不允许重用为localtime 指定的现有之一。如果目标是在不同系统之间实现一致行为,最好避免使用标准函数,而只使用 int64_t 自己的 POSIX seconds-since-the-epoch time 或类似的东西...
    猜你喜欢
    • 2011-08-02
    • 2015-05-21
    • 2011-06-15
    • 2021-12-25
    • 2011-05-05
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多