浅尝C++ 的日期时间库

在C++中, 包含对二类时间操作的支持:

  • chrono 库,以各种精度跟踪时间的类型的灵活汇集(如 std::chrono::time_point )。
  • C 风格日期和时间工具(如 std::time )。

(来自cppreference.com)

chrono 库

chrono库的写着可谓是长的一批

{
  auto t = std::chrono::system_clock::now();
  somexxx()
  std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(
                   (std::chrono::system_clock::now() - t))
                   .count()
            << std::endl;
}

有几个可以用的时钟,分别有:

  • 实时时钟的挂钟时间
  • 决不会调整的单调时钟
  • 最短嘀嗒周期的时钟
  std::cout << steady_clock::now().time_since_epoch().count() << std::endl;
  std::cout << system_clock::now().time_since_epoch().count() << std::endl;
  std::cout << high_resolution_clock::now().time_since_epoch().count() << std::endl;

他们都会返回一个time_point

类模板 std::chrono::time_point 表示时间中的一个点。它被实现成如同存储一个 Duration 类型的自 Clock 的纪元起始开始的时间间隔的值。

我们可以使用 put_time 来结合打印日期

{
  auto t = system_clock::to_time_t(system_clock::now());
  std::cout << std::put_time(localtime(&t), "%F %T\n");
}

可以使用Duration_cast来进行单位换算

{
  auto t = system_clock::now();
  std::cout << duration_cast<microseconds>(t.time_since_epoch()).count()
            << " µs" << std::endl;
  std::cout << duration_cast<milliseconds>(t.time_since_epoch()).count()
            << " ms" << std::endl;
  std::cout << duration_cast<seconds>(t.time_since_epoch()).count()
            << " s" << std::endl;
}

我们还可以进行标量计算

{
  auto t = 2021y / 10 / 1;
  std::cout << (year(2021) == t.year()) << std::endl;
}

想用好chrono库,得要知道 duration是个什么东西

template<  
    class Rep,  
    class Period = std::ratio<1>
>class duration;

Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。

存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。

以下是各种时间标量之间的特化duration

/// nanoseconds
using nanoseconds      = duration<_GLIBCXX_CHRONO_INT64_T, nano>;

/// microseconds
using microseconds     = duration<_GLIBCXX_CHRONO_INT64_T, micro>;

/// milliseconds
using milliseconds     = duration<_GLIBCXX_CHRONO_INT64_T, milli>;

/// seconds
using seconds  = duration<_GLIBCXX_CHRONO_INT64_T>;

/// minutes
using minutes  = duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;

/// hours
using hours           = duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;

/// days
using days             = duration<_GLIBCXX_CHRONO_INT64_T, ratio<86400>>;

/// weeks
using weeks           = duration<_GLIBCXX_CHRONO_INT64_T, ratio<604800>>;

/// years
using years           = duration<_GLIBCXX_CHRONO_INT64_T, ratio<31556952>>;

/// months
using months   = duration<_GLIBCXX_CHRONO_INT64_T, ratio<2629746>>;

通过 duration_cast 将不同的duration类的特化进行转换

time_point

当我们要统计时间间隔时,time_point是不可或缺的的一个东西

template   class time_point;

它可以和 duration进行组合使用

time_point负责时间的计算,duration负责时间的进制转换

C 风格日期与时间库

提供了std::time_t, std::difftime

通过转换后,两种可以使用一样的接口进行访问

{
  auto t = std::time(nullptr);
  std::cout << std::ctime(&t) << std::endl;
  
  auto r =
      duration_cast<seconds>(system_clock::now().time_since_epoch()).count();
  std::cout << std::ctime(&r) << std::endl;
}

[amjieker]

你可能感兴趣的:(札记,c++,开发语言)