搜索中华人民共和国法定计量单位以及国际单位制词头 十然后看下面的代码:

// SI TYPEDEFS
// https://baike.baidu.com/item/%E5%8D%81/62645148?fr=ge_ala
// https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E6%B3%95%E5%AE%9A%E8%AE%A1%E9%87%8F%E5%8D%95%E4%BD%8D/374931?fromModule=lemma_inlink
typedef ratio<1, 1000000000000000000000000LL> yocto;//攸
typedef ratio<1, 1000000000000000000000LL> zepto;//介
typedef ratio<1, 1000000000000000000LL> atto;//阿
typedef ratio<1, 1000000000000000LL> femto;//飞
typedef ratio<1, 1000000000000LL> pico;//皮
typedef ratio<1, 1000000000> nano;//奈
typedef ratio<1, 1000000> micro;//微
typedef ratio<1, 1000> milli;//毫
typedef ratio<1, 100> centi;//厘
typedef ratio<1, 10> deci; // 分
typedef ratio<1, 1> one; // 一
typedef ratio<10, 1> deca; // 十(deca)
typedef ratio<100, 1> hecto;//百
typedef ratio<1000, 1> kilo;//千
typedef ratio<1000000, 1> mega;//百万
typedef ratio<1000000000, 1> giga;//吉
typedef ratio<1000000000000LL, 1> tera;//兆
typedef ratio<1000000000000000LL, 1> peta;//艾
typedef ratio<1000000000000000000LL, 1> exa;//皆

整数定义

template<class _Ty, _Ty _Val>
    struct integral_constant
{	// convenient template for integral constant types
    static constexpr _Ty value = _Val;

    using value_type = _Ty;
    using type = integral_constant;

    constexpr operator value_type() const noexcept {	// return stored value
        return (value);
    }
    _NODISCARD constexpr value_type operator()() const noexcept {	// return stored value
        return (value);
    }
};

符号模板类定义

template<intmax_t _Val>
struct _Sign_of : integral_constant<intmax_t, (_Val < 0 ? -1 : 1)>
{	// computes sign of _Val
};

绝对值模版类

template<intmax_t _Val>
struct _Abs : integral_constant<intmax_t, (_Val < 0 ? -_Val : _Val)>
{	// computes absolute value of _Val
};

模版特化(没看明白作甚)

template<>
struct _Gcd<0, 0> : integral_constant<intmax_t, 1>	// contrary to mathematical convention
{	// avoids division by 0 in ratio_less
};

ratio类

template<intmax_t _Nx, intmax_t _Dx = 1>
    struct ratio
{	// holds the ratio of _Nx to _Dx
    static_assert(_Dx != 0, "zero denominator");
    static_assert(-INTMAX_MAX <= _Nx, "numerator too negative");
    static_assert(-INTMAX_MAX <= _Dx, "denominator too negative");

    static constexpr intmax_t num = _Sign_of<_Nx>::value * _Sign_of<_Dx>::value * _Abs<_Nx>::value / _Gcd<_Nx, _Dx>::value;
    static constexpr intmax_t den = _Abs<_Dx>::value / _Gcd<_Nx, _Dx>::value;

    typedef ratio<num, den> type;
};

duration类

template<class _Rep,
    class _Period>
    class duration
{	// represents a time duration
public:
    using rep = _Rep;
    using period = typename _Period::type;

public:
    _NODISCARD constexpr _Rep count() const {	// get stored rep
        return (_MyRep);
    }
private:
    _Rep _MyRep;	// the stored rep
};

duration_cast函数

template<class _To,
    class _Rep,
    class _Period,
    class = enable_if_t<_Is_duration_v<_To>>>
    constexpr _To duration_cast(const duration<_Rep, _Period>& _Dur) {	// convert duration to another duration; truncate
    using _CF = ratio_divide<_Period, typename _To::period>;
    using _ToRep = typename _To::rep;
    using _CR = common_type_t<_ToRep, _Rep, intmax_t>;

#pragma warning(push)
    return (_CF::num == 1 && _CF::den == 1
        ? static_cast<_To>(static_cast<_ToRep>(_Dur.count()))
        : _CF::num != 1 && _CF::den == 1
            ? static_cast<_To>(static_cast<_ToRep>(
                        static_cast<_CR>( _Dur.count()) * static_cast<_CR>(_CF::num)
                        ))
                : _CF::num == 1 && _CF::den != 1
                    ? static_cast<_To>(static_cast<_ToRep>(
                        static_cast<_CR>(_Dur.count()) / static_cast<_CR>(_CF::den)
                        ))
                    : static_cast<_To>(static_cast<_ToRep>(
                        static_cast<_CR>(_Dur.count()) * static_cast<_CR>(_CF::num) / static_cast<_CR>(_CF::den)
                        ))
        );
#pragma warning(pop)
}

重新using

using nanoseconds = duration<long long, nano>;
using microseconds = duration<long long, micro>;
using milliseconds = duration<long long, milli>;
using seconds = duration<long long>;
using minutes = duration<int, ratio<60>>;
using hours = duration<int, ratio<3600>>;

以上代码都在std::chrono::命名空间中,ratio(std::ratio)除外,然后使用例子如下:

看完上面的东西,仔细理解一下代码里最后3个std::cout输出

// 以下为5分钟表达
std::chrono::minutes minute1{ 5 };                                      // 5个1分钟
std::chrono::duration<int, std::ratio<5 * 60, 1>> minute2{ 1 };         // 1个5分钟
std::chrono::duration<double, std::ratio<2 * 60, 1>> minute3{ 2.5 };    // 2.5个2分钟
std::cout
    << "minutes1 duration has " << minute1.count() << " ticks\n"    // 5
    << "minutes2 duration has " << minute2.count() << " ticks\n"    // 1
    << "minutes3 duration has " << minute3.count() << " ticks\n\n"; // 2.5

// 以下为12小时表达
std::chrono::hours hours1{ 12 }; // 12个1小时
std::chrono::duration<double, std::ratio<60 * 60 * 24, 1>> hours2{ 0.5 }; // 0.5个1天
std::cout
    << "hours1 duration has " << hours1.count() << " ticks\n"    //  12
    << "hours2 duration has " << hours2.count() << " ticks\n\n"; //  0.5

// 使用 std::chrono::duration_cast<T> 将分钟间隔转化成标准秒间隔
// minutes1(5分钟) duration has 300秒
std::cout
    << "minutes1(" << minute1.count() << "分钟) duration has " <<
    std::chrono::duration_cast<std::chrono::seconds>(minute1).count() << "秒\n";
std::cout
    << "minute2(" << minute2.count() << "分钟) duration has " <<
    std::chrono::duration_cast<std::chrono::seconds>(minute2).count() << "秒\n";
std::cout
    << "minute3(" << minute1.count() << "分钟) duration has " <<
    std::chrono::duration_cast<std::chrono::seconds>(minute3).count() << "秒\n";

根据时钟得到现在时间

// 根据时钟得到现在时间
std::chrono::system_clock::time_point today = std::chrono::system_clock::now();
std::time_t time_t_today = std::chrono::system_clock::to_time_t(today);
/*
	now time stamp is 1702783551
	now time       is Sun Dec 17 11:25:51 2023
*/
std::cout << "now time stamp is " << time_t_today << std::endl;
std::cout << "now time       is " << std::ctime(&time_t_today) << std::endl;

计算时间差

typedef std::chrono::steady_clock     T1;
typedef std::chrono::duration<double> T2;

// 先记录程序运行时间
T1::time_point start = T1::now();

// volatile禁止程序对修饰的变量做优化,读取这个变量的时候,都会直接从内存中读取数据
volatile __int64 nDstVal = 1;
volatile __int64 nSrcVal = 1;
for (__int64 i = 0; i < 1000000000; ++i)
  nDstVal = nSrcVal;

// 做差值计算耗时
// total cost 2.09704 seconds.
T2 duration_cost = std::chrono::duration_cast<T2>(T1::now() - start);
std::cout << "total cost " << duration_cost.count() << " seconds." << std::endl;

获取系统时间

// 待续