C++ 基于当前时间返回下一整秒

C++ 基于当前时间返回下一整秒,c++,c++11,chrono,C++,C++11,Chrono,我正在尝试创建一个将在下一整秒钟返回的函数,但是通过查看c++11std::chrono文档,我找不到任何明显的方法来实现这一点 示例:如果当前时间为09:50:01.1234我希望函数返回09:50:02.0000(即下一整秒) 如果可能,使用std::chrono? 我想实现的目标是尽可能每一秒都执行一个特定的动作。因此,我将使用结果睡眠一段时间,持续时间为return\u next\u full\u second()-system\u clock::now()您可以使用静态system\u

我正在尝试创建一个将在下一整秒钟返回的函数,但是通过查看c++11
std::chrono
文档,我找不到任何明显的方法来实现这一点

示例:如果当前时间为
09:50:01.1234
我希望函数返回
09:50:02.0000
(即下一整秒)

如果可能,使用
std::chrono


我想实现的目标是尽可能每一秒都执行一个特定的动作。因此,我将使用结果睡眠一段时间,持续时间为
return\u next\u full\u second()-system\u clock::now()

您可以使用静态
system\u clock::to\u time\t
方法获得一个
time\t
对象

时间\u t
通常是“自历元起的秒数”,因此它已经四舍五入为秒

然后可以使用
system\u clock::from\u time\t
time\t
获取
system\u clock::time\u point
对象

要确保
到\u time\t
真的四舍五入,只需将四舍五入的时间点与初始时间点进行比较。如果它小于该时间点,只需添加一秒


此解决方案的唯一问题是,
时间\u t
没有严格定义为秒,因此解决方案可能不可移植。

您可以将持续时间强制转换为秒:

#include <chrono>
#include <iostream>

std::chrono::system_clock::time_point return_next_full_second()
{
    using namespace std::chrono;
    system_clock::time_point now = system_clock::now();
    auto s = duration_cast<seconds>(now.time_since_epoch());
    return system_clock::time_point(++s);
}

int main() {
    using namespace std::chrono;
    auto t = return_next_full_second();
    auto d = duration_cast<milliseconds>(t.time_since_epoch());
    std::cout <<  d.count() << '\n';
}
#包括
#包括
标准::时钟::系统时钟::时间点返回下一个完整秒()
{
使用名称空间std::chrono;
系统时钟::时间点现在=系统时钟::现在();
自动s=持续时间(现在。时间(从新纪元开始)();
返回系统时钟::时间点(++s);
}
int main(){
使用名称空间std::chrono;
自动t=返回下一个完整秒();
自动d=持续时间(t.时间(自)开始);

谢谢。我真的希望有一个可移植的解决方案,但如果不存在,我会使用这种方法。我不会从t-epoch获得ms中的最后一个强制转换。你想解释一下吗?@MarcoA。看看结果能保持几秒钟(最后3个零)明白了,谢谢。这是一个更好的解决方案,我可以编辑一下吗?还有一个语法typo@MarcoA.ctime表示自历元(因此回滚)以来经过的秒数。以下是一些有用的持续时间计时取整函数,可用于解决此问题:
#include <chrono>
#include <iostream>

std::chrono::system_clock::time_point return_next_full_second()
{
    using namespace std::chrono;
    system_clock::time_point now = system_clock::now();
    auto s = duration_cast<seconds>(now.time_since_epoch());
    return system_clock::time_point(++s);
}

int main() {
    using namespace std::chrono;
    auto t = return_next_full_second();
    auto d = duration_cast<milliseconds>(t.time_since_epoch());
    std::cout <<  d.count() << '\n';
}