首页 > 解决方案 > C++:使用后缀设置时间

问题描述

告诉我,C++ 11/14/17 中是否存在以下内容:

1) 使用时间后缀设置时间

double time1 = 1s; // time1 = 1.0
double time2 = 2m; // time2 = 120.0
double time3 = 7ms; // time3 = 0.007 

2) 获取设置为后缀的时间的字符串值

std::cout << getTime(time1); // cout 1s
std::cout << getTime(time2); // cout 2s
std::cout << getTime(time3); // cout 7ms

标签: c++c++11timec++14user-defined-literals

解决方案


所有现代 C++ 时间实用程序都在参考中进行了描述<chrono>

  1. 的,从开始,我们有std::literals::chrono_literals,允许我们使用以下文字:

    operator""h
    operator""min
    operator""s
    operator""ms
    operator""us
    operator""ns
    

    例如(来自 cppreference):

    #include <iostream>
    #include <chrono>
    
    int main()
    {
        using namespace std::chrono_literals;
        auto day = 24h;
        auto halfhour = 0.5h;
        std::cout << "one day is " << day.count() << " hours\n"
                  << "half an hour is " << halfhour.count() << " hours\n";
    }
    

  1. 不是直接的,而是从开始,有 std::chrono::duration几个方便的辅助类型来帮助正确描述时间(例如std::chrono::millisceondsstd::chrono::hours等)。使用这些,您可以轻松地完成所需的工作。

    来自cppreference的缩短示例 。如您所见,单位必须单独打印,但通过一些模板魔法选择正确的打印单位就很容易了。

    #include <iostream>
    #include <chrono>
    
    int main()
    {     
        std::chrono::seconds sec(1);
    
        std::cout << sec.count() <<" second is equal to:\n";
    
        // integer scale conversion with no precision loss: no cast
        std::cout << std::chrono::microseconds(sec).count() << " microseconds\n";
    
        // integer scale conversion with precision loss: requires a cast
        std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
                  << " minutes\n";
    }
    

推荐阅读