Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何可移植地向time\t对象添加大量秒数?_C++_C++11 - Fatal编程技术网

C++ 如何可移植地向time\t对象添加大量秒数?

C++ 如何可移植地向time\t对象添加大量秒数?,c++,c++11,C++,C++11,嗯,我想标题概括了这一点。假设我有一个类型为double的对象,它是我在两个time\t对象上运行std::difftime得到的,现在我想将结果秒数加回到time\t对象。我不介意失去几秒钟 请注意,秒数可能很大(即大于struct tm中允许的60秒,但始终小于用于表示相应机器/实现上秒数的任何整数原语,并且永远不会大于1年的数量级,尽管我不希望这成为限制) 我将如何进行便携操作(即按照C标准) 我希望不必将它们分成月、日、小时、分钟等,然后手动添加到struct tm对象中。当然有更好的办

嗯,我想标题概括了这一点。假设我有一个类型为
double
的对象,它是我在两个
time\t
对象上运行
std::difftime
得到的,现在我想将结果秒数加回到
time\t
对象。我不介意失去几秒钟

请注意,秒数可能很大(即大于struct tm中允许的60秒,但始终小于用于表示相应机器/实现上秒数的任何整数原语,并且永远不会大于1年的数量级,尽管我不希望这成为限制)

我将如何进行便携操作(即按照C标准)

我希望不必将它们分成月、日、小时、分钟等,然后手动添加到
struct tm
对象中。当然有更好的办法

看起来像是一个复制品

“C日期/时间类型time_t被实现为自某个日期起的秒数,因此,要向其添加秒数,只需使用普通算术即可。”


即使是C,也不应该与C++:(<)/P> < P> >使用代码> LoalTime< /Cord>将你的代码> TimeTyt值转换成<代码> StuttTM <代码>,它将时间分解为小时、分钟、秒等。然后使用

mktime
将结构中的值转换为
time\t

,您可以使用
time\t
值执行算术运算

可以设置两个<代码>结构> t>代码>对象一秒钟(在一分钟内选择两次,不允许发生跳跃秒,在DST不改变的本地时间),并调用<代码> MKTime[()/代码>两者,以获得两个<代码> TimeTyt < /Cord>值。从后面的值中减去那些
time\t
值中的较早者,这将为您提供一秒,单位数与系统上测量
time\t
的单位数相同。将该值乘以要添加的秒数,然后将结果添加到原始的
时间值中。您可以通过再次调用原始和新的
time\t
值上的
difftime()
来检查结果,以查看秒差是否与您预期的相同


请注意,即使这样也不能保证是可移植的,因为从技术上讲,
time\u t
甚至不需要有能够区分秒的分辨率,但它是一个非常奇怪的实现,没有。另外,如果
time\u t
是一个浮点值(这是不寻常的),并且您想要添加非常非常大的秒数,那么您可能会遇到浮点精度问题。在这种情况下,您可以尝试添加小时,而不是秒,并相应地设置两个
struct tm
structs。您可能会在足够长的秒数内遇到溢出问题,这是您无法解决的。

在可移植性方面,epoch是您的朋友。
time\u t
是一种算术类型(整数或浮点),因此,添加一个
双精度
应该可以。您可以使用C++11的
?@matstpeterson-但是
时间
不需要表示秒;它只是“能够表示时间”。@ MnOOSoSE:或者为什么我们要编写代码,它故意使完全复杂,只是为了能够支持没有人实际使用的架构。C和C++都不要求代码> TimeTyt < /Cuff>代表秒。@ PeteBecker:POSIX至少保证支持
tm_sec+=12131898-它确实提到值可能超出范围,但从我所看到的情况来看,“多少”并不清楚。我想我们可以除以86400,把它加到
tmmd;day
,然后把剩下的除以
hours
minutes
和days,也许。@Matstpeterson手动这样做是OP试图避免的。@Matstpeterson也不是每天都有86400秒——也就是说,由于DST和闰秒,连续两天相同的挂钟时间之间经过的时间不一样,谁知道还有什么。(正确的时间计算并不容易。看和)@millimoose:现在我一点也不跟随。你是说上面的建议行得通还是行不通?如果是这样的话,只需在
localtime
产生的
tm_sec
中添加任意(大)秒数,并将其传递回
mktime
即可吗?[显然,如果差异超过68年,这种方法将不起作用,因为
tm_sec
将溢出,但我预计OP对未来60多年不感兴趣,所以现在让我们忽略它]。@Matsbeterson似乎只有在OP的
double
值(+60)不会溢出
int
时才起作用。文件中未说明其是否可靠工作。它是否比添加到
time\t
更好,我不确定。您的建议容易出现这样的问题,例如,
time\u t
的值在闰秒期间会减小-因此,在其上增加三秒可能不会使您的时间实际上比原来的时间晚三秒。我想我这里更重要的一点是:在做时间数学的时候,不要相信你的直觉,它可能会在某个地方碰到一个边缘情况。需要注意的是,你不能在意闰秒或其他导致时间不单调增加的奇怪现象所导致的不精确性。(因为
time\u t
与底层系统时钟不同。)@millimoose:是的,您显然必须对系统上的时间实现感到满意。如果您的实现支持闰秒,那么将
time\t
增加固定的秒数将得到您想要的结果。如果没有,那么obvio