【问题标题】:How to get the difference in milliseconds between the start time and now() in C++?如何在 C++ 中获取开始时间和 now() 之间的毫秒差?
【发布时间】:2020-02-04 19:51:59
【问题描述】:

我的初始代码是

using n_time = std::chrono::high_resolution_clock;
n_time::time_point c_time = n_time::now();
n_time::time_point start = n_time::now();


auto gyro::duration(){
    return std::chrono::duration_cast<std::chrono::milliseconds>(c_time-start).count();
}

但后来我意识到我想找到从开始参数到now() 的毫秒数,我不确定我的初始代码是否会给我这个。所以我尝试了

auto timeSince(n_time::time_point start) {
    n_time now = n_time::now();
    return std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
}

这是您如何找到start 之后的毫秒数吗?听说有一个函数叫time_since_epoch(),不知道用这个函数会不会更好?

此时钟用于我正在尝试编写的特定机器人功能,因此我需要确保时钟不会导致转换错误:

void straight(int distance, int speed) { 
    int time = (distance / speed) * 1000; // milliseconds        
    while (timeSince() < time) {
        // code
    }
}

duration() 函数在我的函数中没有给出任何错误,但timeSince() 给我带来了转换错误,例如

错误:从“int”转换为非标量类型 'std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point >

【问题讨论】:

  • 你可以考虑使用auto作为类型,因为你的n_time now=n_time::now();是错误的类型。除此之外,你的初始方法是正确的。

标签: c++ chrono


【解决方案1】:

如果您仔细查看与std::chrono::high_resolution_clock 相关的C++ 标准,您会发现它包含一个成员类型std::chrono::high_resolution_clock::time_point,它等效于std::chrono::time_point&lt;std::chrono::high_resolution_clock&gt;

除了上述成员类型之外,std::chrono::high_resolution_clock 还包含成员函数now,它返回一个std::chrono::time_point&lt;std::chrono::high_resolution_clock&gt;,即std::chrono::high_resolution_clock::time_point,代表时钟的当前值。

在你的函数中,你有

n_time now = n_time::now();

即您正在尝试将std::chrono::high_resolution_clock::time_point 分配给std::chrono::high_resolution_clock 类型的变量,这听起来不太清楚,对吧?所以,你应该有

n_time::time_point now = n_time::now();

这里是完整的代码:

#include <chrono>
#include <iostream>

using n_time = std::chrono::high_resolution_clock;

auto timeSince(n_time::time_point start) {
    n_time::time_point now = n_time::now();
    return std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
}

int main() {
    auto now = n_time::now() - std::chrono::seconds{3600};
    std::cout << timeSince(now) << std::endl;
    return 0;
}

结果以毫秒为单位:

3600000

更新

在您的案例中如何使用上述工作示例:

void straight(int distance, int speed) {
    auto start = n_time::now();

    // some time has passed since this function has started

    int time = (distance / speed) * 1000; // milliseconds        
    while (timeSince(start) < time) {
        // code
    }
}

【讨论】:

  • 非常感谢!不过,我希望 timeSince() 中的 start 参数在函数 straight(int distance, int speed) 启动时出现。你知道我怎么能做到这一点吗?
  • @ororodislikesphysicalexertion 我更新了我的答案。如果对您有帮助,请查看并投票并接受(选票下方的绿色勾号)答案
  • 好吧,我试过了,得到一个转换错误,说“无效的操作数类型 'void' 和 'int' 到二进制 'operator
  • @ororodislikesphysicalexertion 不应该发生错误。检查here
【解决方案2】:

我听说有一个名为 time_since_epoch() 的函数,我不确定用它是否会更好

并非如此,请参见例如When is std::chrono epoch?:

有一个事实上的(非官方的)标准,std::chrono::system_clock::time_point 的纪元与 Unix 时间一致。这被定义为自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的持续时间,不包括闰秒。

你看到的错误是由这一行产生的

n_time now = n_time::now();

应该是这样的

n_time::time_point now = n_time::now();
//    ^^^^^^^^^^^^

给定using n_time = std::chrono::high_resolution_clock;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多