c++11 日期和时间工具 (std::chrono::time_point)(一)

定义于头文件 <chrono>
template<class Clock, class Duration = 
typename Clock::duration> class time_point;

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

Clock 必须满足时钟 (Clock) 的要求或为 std::chrono::local_t (C++20 起)。

成员类型

成员类型定义
clockClock ,此时间点在此时钟上计量
durationDuration ,用于计量从纪元起时间的 std::chrono::duration 类型
repRep ,表示时期的计次数的算术类型
periodPeriod ,表示时期周期的 std::ratio 类型

构造函数 

std::chrono::time_point<Clock,Duration>::time_point
time_point();  (C++11 起)  (C++14 前) 

constexpr time_point();    (C++14 起) 

explicit time_point( const duration& d );  (C++11 起) (C++14 前) 

constexpr explicit time_point( const duration& d ); (C++14 起)  

template< class Duration2 > time_point( 
const time_point<Clock,Duration2>& t ); (C++11 起) (C++14 前) 

template< class Duration2 >
constexpr time_point( const time_point<Clock,Duration2>& t ); (C++14 起) 

从数个可选数据源之一构造新的 time_point

1) 默认构造函数,创建表示 Clock 的纪元(即 time_since_epoch() 为零)的 time_point

2) 构造位于 Clock 的纪元加上 dtime_point

3) 通过转换 tduration 构造 time_point 。此构造函数仅若 Duration2 可隐式转换为 duration 才参与重载决议。

参数

d-复制来源的 duration
t-转换来源的 time_point

 调用示例

#include <chrono>
#include <iostream>

using Clock = std::chrono::high_resolution_clock;
using TimePoint = std::chrono::time_point<Clock>;

void print_ms(const TimePoint& point)
{
    using Ms = std::chrono::milliseconds;
    const Clock::duration since_epoch = point.time_since_epoch();
    std::cout << std::chrono::duration_cast<Ms>(since_epoch).count() << " ms\n";
}

int main()
{
    const TimePoint default_value = TimePoint(); // (1)
    print_ms(default_value); // 0 ms

    const Clock::duration duration_4_seconds = std::chrono::seconds(4);
    const TimePoint time_point_4_seconds(duration_4_seconds); // (2)
    // 从纪元开始 4 秒
    print_ms(time_point_4_seconds); // 4000 ms

    const TimePoint time_point_now = Clock::now(); // (3)
    print_ms(time_point_now); // 43098276 ms
}

返回表示为从其时钟起点开始的时间点

std::chrono::time_point<Clock,Duration>::time_since_epoch

duration time_since_epoch() const;

(C++11 起)
(C++14 前)

constexpr duration time_since_epoch() const;

(C++14 起)

返回表示 *this 与 clock 的纪元间的时间量的 duration 。

参数

(无)

返回值

time_pointclock 的纪元间的时间量

调用示例

#include <iostream>
#include <chrono>
#include <ctime>
 
int main()
{
    auto p0 = std::chrono::time_point<std::chrono::system_clock>{};
    auto p1 = std::chrono::system_clock::now();
    auto p2 = p1 - std::chrono::hours(24);
 
    auto epoch_time = std::chrono::system_clock::to_time_t(p0);
    std::cout << "epoch: " << std::ctime(&epoch_time);
    auto today_time = std::chrono::system_clock::to_time_t(p1);
    std::cout << "today: " << std::ctime(&today_time);
 
    std::cout << "hours since epoch: "
              << std::chrono::duration_cast<std::chrono::hours>(
                   p1.time_since_epoch()).count() 
              << '\n';
    std::cout << "yesterday, hours since epoch: "
              << std::chrono::duration_cast<std::chrono::hours>(
                   p2.time_since_epoch()).count() 
              << '\n';
}

 输出

以给定的 duration 修改 time_point

std::chrono::time_point<Clock,Duration>::operator+, operator-

time_point& operator+=( const duration& d );

(1)(C++17 前)

constexpr time_point& operator+=( const duration& d );

(C++17 起)

time_point& operator-=( const duration& d );

(2)(C++17 前)

constexpr time_point& operator-=( const duration& d );

(C++17 起)

以指定的时长修改时间点。

1) 应用偏移 dpt 。等效地以 d_ += d 将 d 加到内部存储的 duration 。

2) 以负方向应用偏移 dpt 。等效地以 d_ -= d 从内部存储的 duration d_ 减去 d

参数

d-要应用的时间偏移

返回值

*this 。

异常

(无)

调用示例

#include <iostream>
#include <chrono>
#include <ctime>

int main()
{
    auto p1 = std::chrono::system_clock::now();
    auto today_time = std::chrono::system_clock::to_time_t(p1);
    std::cout << "now(): " << std::ctime(&today_time);

    auto p2 = p1;
    p2 += std::chrono::hours(24);
    today_time = std::chrono::system_clock::to_time_t(p2);
    std::cout << "now() + hours(24) : " << std::ctime(&today_time);

    auto p3 = p1;
    p3 -= std::chrono::hours(24);
    today_time = std::chrono::system_clock::to_time_t(p3);
    std::cout << "now() - hours(24) : " << std::ctime(&today_time);
}

 输出

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值