【发布时间】:2018-01-18 18:07:22
【问题描述】:
time_t 这是平台相关类型。我找到了difftime,它以秒为单位返回差异,但我没有找到没有任何转换的简单减法函数。我如何知道标准并不能保证在整个时间连续体中始终如一,也没有告诉任何关于time_t 的编码。它也没有告诉两个不同的time_t 不会代表一个时刻。但在现实生活中我不确定。
time_t 数据类型是 ISO C 库中定义的数据类型 存储系统时间值。这些值是从标准返回的 time() 库函数。这种类型是定义在 标准标题。 ISO C 将 time_t 定义为算术类型, 但未指定任何特定类型、范围、分辨率或 为它编码。算术的含义也未指定 应用于时间值的操作。
Unix 和 POSIX 兼容系统将 time_t 实现为整数或 实浮点类型(通常是 32 位或 64 位整数) 表示自 Unix 纪元开始以来的秒数: UTC 时间 1970 年 1 月 1 日午夜(不包括闰秒)。一些 系统正确处理负时间值,而其他系统则不能。 使用带符号的 32 位 time_t 类型的系统容易受到年份的影响 2038问题。]
https://en.wikipedia.org/w/index.php?title=Time_t&oldid=450752800
我的意思是我需要time_t 作为回报:
time_t v1;
time_t v2;
time_t diff;
diff = some_substract_fct(v2, v1)
在没有difftime 的情况下比较/减去两个time_t 是否安全?例如:
time_t v1;
time_t v2;
time_t diff;
if (v2 > v1)
{
....
}
if (v2 == v1)
{
....
}
v3 = v2-v1;
改为
if (difftime(v2, v1) > 0)
{
}
if (difftime(v2, v1) == 0.0)
{
}
diff = some_substract_fct(v2, v1)
【问题讨论】:
-
使用
-是不安全的,因为表示是特定于实现的,请参见此处:stackoverflow.com/a/13855956/8051589。这也适用于比较运算符,另见此处:stackoverflow.com/a/25198359/8051589。由于表示是实现定义的此时间戳值time_t无法保存时间差。为什么双精度值不适合您? -
大多数实现(我目前使用的)将使用一个整数值,其中
-、<、>、!=和==将起作用。但这不能保证。 -
@Andre Kampling:因为我有一些任务管理器负责时间计算、操作、调度等,我想使用一种类型 (
time_t) 而不进行任何转换。如果我需要时差,我会打电话给difftime。如果我需要解码time_t(带有时区处理),我会打电话给localtime。例如。添加到time_t一些差异。是否真的需要将time_t转换为tm然后进行一些处理并将结果转换回time_t?我希望在没有转换的情况下以更微小的方式存在。例如。time_t diff = some_fct(t2-t1) -
time_t是算术类型,因此减法本身不是问题。差异的符号当然是预期的,以后的时间有更大的价值。然而time_t的规模和时代尚不清楚。建议将减法包装在辅助函数中。 -
请注意,您需要使用
@而不是2才能将通知发送给个人(@Jonathan有效,2Jonathan无效)。