#include <compare>
namespace std {
namespace chrono {
// 类模板 duration
template<class Rep, class Period = ratio<1>> class duration;
// 类模板 time_point
template<class Clock, class Duration = typename Clock::duration> class time_point;
}
// common_type 特化
template<class Rep1, class Period1, class Rep2, class Period2>
struct common_type<chrono::duration<Rep1, Period1>,
chrono::duration<Rep2, Period2>>;
template<class Clock, class Duration1, class Duration2>
struct common_type<chrono::time_point<Clock, Duration1>,
chrono::time_point<Clock, Duration2>>;
namespace chrono {
// 定制特征
template<class Rep> struct treat_as_floating_point;
template<class Rep>
inline constexpr bool treat_as_floating_point_v = treat_as_floating_point<Rep>::value;
template<class Rep> struct duration_values;
template<class T> struct is_clock;
template<class T> inline constexpr bool is_clock_v = is_clock<T>::value;
// duration 算术
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator*(const duration<Rep1, Period>& d, const Rep2& s);
template<class Rep1, class Rep2, class Period>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator*(const Rep1& s, const duration<Rep2, Period>& d);
template<class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator/(const duration<Rep1, Period>& d, const Rep2& s);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<Rep1, Rep2>
operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator%(const duration<Rep1, Period>& d, const Rep2& s);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
// duration 比较
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator< (const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator> (const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<=(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>=(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Rep2, class Period2>
requires /* 见描述 */
constexpr auto operator<=>(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
// 转换
template<class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);
template<class ToDuration, class Rep, class Period>
constexpr ToDuration floor(const duration<Rep, Period>& d);
template<class ToDuration, class Rep, class Period>
constexpr ToDuration ceil(const duration<Rep, Period>& d);
template<class ToDuration, class Rep, class Period>
constexpr ToDuration round(const duration<Rep, Period>& d);
// duration I/O
template<class CharT, class Traits, class Rep, class Period>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os,
const duration<Rep, Period>& d);
template<class CharT, class Traits, class Rep, class Period, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
duration<Rep, Period>& d,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 便利 typedef
using nanoseconds = duration</* 至少有 64 位的有符号整数类型 */, nano>;
using microseconds = duration</* 至少有 55 位的有符号整数类型 */, micro>;
using milliseconds = duration</* 至少有 45 位的有符号整数类型 */, milli>;
using seconds = duration</* 至少有 35 位的有符号整数类型 */>;
using minutes = duration</* 至少有 29 位的有符号整数类型 */,
ratio< 60>>;
using hours = duration</* 至少有 23 位的有符号整数类型 */,
ratio<3600>>;
using days = duration</* 至少有 25 位的有符号整数类型 */,
ratio_multiply<ratio<24>, hours::period>>;
using weeks = duration</* 至少有 22 位的有符号整数类型 */,
ratio_multiply<ratio<7>, days::period>>;
using years = duration</* 至少有 17 位的有符号整数类型 */,
ratio_multiply<ratio<146097, 400>, days::period>>;
using months = duration</* 至少有 20 位的有符号整数类型 */,
ratio_divide<years::period, ratio<12>>>;
// time_point 算术
template<class Clock, class Duration1, class Rep2, class Period2>
constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>>
operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
template<class Rep1, class Period1, class Clock, class Duration2>
constexpr time_point<Clock, common_type_t<duration<Rep1, Period1>, Duration2>>
operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, class Rep2, class Period2>
constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>>
operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
template<class Clock, class Duration1, class Duration2>
constexpr common_type_t<Duration1, Duration2>
operator-(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
// time_point 比较
template<class Clock, class Duration1, class Duration2>
constexpr bool operator==(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, class Duration2>
constexpr bool operator< (const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, class Duration2>
constexpr bool operator> (const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, class Duration2>
constexpr bool operator<=(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, class Duration2>
constexpr bool operator>=(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template<class Clock, class Duration1, three_way_comparable_with<Duration1> Duration2>
constexpr auto operator<=>(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
// 转换
template<class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
time_point_cast(const time_point<Clock, Duration>& t);
template<class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration> floor(const time_point<Clock, Duration>& tp);
template<class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration> ceil(const time_point<Clock, Duration>& tp);
template<class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration> round(const time_point<Clock, Duration>& tp);
// 特化的算法
template<class Rep, class Period>
constexpr duration<Rep, Period> abs(duration<Rep, Period> d);
// 类 system_clock
class system_clock;
template<class Duration>
using sys_time = time_point<system_clock, Duration>;
using sys_seconds = sys_time<seconds>;
using sys_days = sys_time<days>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const sys_time<Duration>& tp);
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const sys_days& dp);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
sys_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 utc_clock
class utc_clock;
template<class Duration>
using utc_time = time_point<utc_clock, Duration>;
using utc_seconds = utc_time<seconds>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const utc_time<Duration>& t);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
utc_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
struct leap_second_info;
template<class Duration>
leap_second_info get_leap_second_info(const utc_time<Duration>& ut);
// 类 tai_clock
class tai_clock;
template<class Duration>
using tai_time = time_point<tai_clock, Duration>;
using tai_seconds = tai_time<seconds>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const tai_time<Duration>& t);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
tai_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 gps_clock
class gps_clock;
template<class Duration>
using gps_time = time_point<gps_clock, Duration>;
using gps_seconds = gps_time<seconds>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const gps_time<Duration>& t);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
gps_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类型 file_clock
using file_clock = /* 见描述 */;
template<class Duration>
using file_time = time_point<file_clock, Duration>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const file_time<Duration>& tp);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
file_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 steady_clock
class steady_clock;
// 类 high_resolution_clock
class high_resolution_clock;
// 本地时间
struct local_t {};
template<class Duration>
using local_time = time_point<local_t, Duration>;
using local_seconds = local_time<seconds>;
using local_days = local_time<days>;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const local_time<Duration>& tp);
template<class CharT, class Traits, class Duration, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
local_time<Duration>& tp,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// time_point 转换
template<class DestClock, class SourceClock>
struct clock_time_conversion;
template<class DestClock, class SourceClock, class Duration>
auto clock_cast(const time_point<SourceClock, Duration>& t);
// 类 last_spec
struct last_spec;
// 类 day
class day;
constexpr bool operator==(const day& x, const day& y) noexcept;
constexpr strong_ordering operator<=>(const day& x, const day& y) noexcept;
constexpr day operator+(const day& x, const days& y) noexcept;
constexpr day operator+(const days& x, const day& y) noexcept;
constexpr day operator-(const day& x, const days& y) noexcept;
constexpr days operator-(const day& x, const day& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const day& d);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
day& d, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 month
class month;
constexpr bool operator==(const month& x, const month& y) noexcept;
constexpr strong_ordering operator<=>(const month& x, const month& y) noexcept;
constexpr month operator+(const month& x, const months& y) noexcept;
constexpr month operator+(const months& x, const month& y) noexcept;
constexpr month operator-(const month& x, const months& y) noexcept;
constexpr months operator-(const month& x, const month& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const month& m);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
month& m, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 year
class year;
constexpr bool operator==(const year& x, const year& y) noexcept;
constexpr strong_ordering operator<=>(const year& x, const year& y) noexcept;
constexpr year operator+(const year& x, const years& y) noexcept;
constexpr year operator+(const years& x, const year& y) noexcept;
constexpr year operator-(const year& x, const years& y) noexcept;
constexpr years operator-(const year& x, const year& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year& y);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
year& y, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 weekday
class weekday;
constexpr bool operator==(const weekday& x, const weekday& y) noexcept;
constexpr weekday operator+(const weekday& x, const days& y) noexcept;
constexpr weekday operator+(const days& x, const weekday& y) noexcept;
constexpr weekday operator-(const weekday& x, const days& y) noexcept;
constexpr days operator-(const weekday& x, const weekday& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const weekday& wd);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
weekday& wd, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 weekday_indexed
class weekday_indexed;
constexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
// 类 weekday_last
class weekday_last;
constexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
// 类 month_day
class month_day;
constexpr bool operator==(const month_day& x, const month_day& y) noexcept;
constexpr strong_ordering operator<=>(const month_day& x, const month_day& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const month_day& md);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
month_day& md, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 month_day_last
class month_day_last;
constexpr bool operator==(const month_day_last& x, const month_day_last& y) noexcept;
constexpr strong_ordering operator<=>(const month_day_last& x,
const month_day_last& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
// 类 month_weekday
class month_weekday;
constexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
// 类 month_weekday_last
class month_weekday_last;
constexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
// 类 year_month
class year_month;
constexpr bool operator==(const year_month& x, const year_month& y) noexcept;
constexpr strong_ordering operator<=>(const year_month& x, const year_month& y) noexcept;
constexpr year_month operator+(const year_month& ym, const months& dm) noexcept;
constexpr year_month operator+(const months& dm, const year_month& ym) noexcept;
constexpr year_month operator-(const year_month& ym, const months& dm) noexcept;
constexpr months operator-(const year_month& x, const year_month& y) noexcept;
constexpr year_month operator+(const year_month& ym, const years& dy) noexcept;
constexpr year_month operator+(const years& dy, const year_month& ym) noexcept;
constexpr year_month operator-(const year_month& ym, const years& dy) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year_month& ym);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
year_month& ym, basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 year_month_day
class year_month_day;
constexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept;
constexpr strong_ordering operator<=>(const year_month_day& x,
const year_month_day& y) noexcept;
constexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;
constexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;
constexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;
constexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;
constexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept;
constexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
template<class CharT, class Traits, class Alloc = allocator<CharT>>
basic_istream<CharT, Traits>&
from_stream(basic_istream<CharT, Traits>& is, const CharT* fmt,
year_month_day& ymd,
basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
minutes* offset = nullptr);
// 类 year_month_day_last
class year_month_day_last;
constexpr bool operator==(const year_month_day_last& x,
const year_month_day_last& y) noexcept;
constexpr strong_ordering operator<=>(const year_month_day_last& x,
const year_month_day_last& y) noexcept;
constexpr year_month_day_last
operator+(const year_month_day_last& ymdl, const months& dm) noexcept;
constexpr year_month_day_last
operator+(const months& dm, const year_month_day_last& ymdl) noexcept;
constexpr year_month_day_last
operator+(const year_month_day_last& ymdl, const years& dy) noexcept;
constexpr year_month_day_last
operator+(const years& dy, const year_month_day_last& ymdl) noexcept;
constexpr year_month_day_last
operator-(const year_month_day_last& ymdl, const months& dm) noexcept;
constexpr year_month_day_last
operator-(const year_month_day_last& ymdl, const years& dy) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
// 类 year_month_weekday
class year_month_weekday;
constexpr bool operator==(const year_month_weekday& x,
const year_month_weekday& y) noexcept;
constexpr year_month_weekday
operator+(const year_month_weekday& ymwd, const months& dm) noexcept;
constexpr year_month_weekday
operator+(const months& dm, const year_month_weekday& ymwd) noexcept;
constexpr year_month_weekday
operator+(const year_month_weekday& ymwd, const years& dy) noexcept;
constexpr year_month_weekday
operator+(const years& dy, const year_month_weekday& ymwd) noexcept;
constexpr year_month_weekday
operator-(const year_month_weekday& ymwd, const months& dm) noexcept;
constexpr year_month_weekday
operator-(const year_month_weekday& ymwd, const years& dy) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
// 类 year_month_weekday_last
class year_month_weekday_last;
constexpr bool operator==(const year_month_weekday_last& x,
const year_month_weekday_last& y) noexcept;
constexpr year_month_weekday_last
operator+(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
constexpr year_month_weekday_last
operator+(const months& dm, const year_month_weekday_last& ymwdl) noexcept;
constexpr year_month_weekday_last
operator+(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
constexpr year_month_weekday_last
operator+(const years& dy, const year_month_weekday_last& ymwdl) noexcept;
constexpr year_month_weekday_last
operator-(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
constexpr year_month_weekday_last
operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
// 公历约定语法运算符
constexpr year_month
operator/(const year& y, const month& m) noexcept;
constexpr year_month
operator/(const year& y, int m) noexcept;
constexpr month_day
operator/(const month& m, const day& d) noexcept;
constexpr month_day
operator/(const month& m, int d) noexcept;
constexpr month_day
operator/(int m, const day& d) noexcept;
constexpr month_day
operator/(const day& d, const month& m) noexcept;
constexpr month_day
operator/(const day& d, int m) noexcept;
constexpr month_day_last
operator/(const month& m, last_spec) noexcept;
constexpr month_day_last
operator/(int m, last_spec) noexcept;
constexpr month_day_last
operator/(last_spec, const month& m) noexcept;
constexpr month_day_last
operator/(last_spec, int m) noexcept;
constexpr month_weekday
operator/(const month& m, const weekday_indexed& wdi) noexcept;
constexpr month_weekday
operator/(int m, const weekday_indexed& wdi) noexcept;
constexpr month_weekday
operator/(const weekday_indexed& wdi, const month& m) noexcept;
constexpr month_weekday
operator/(const weekday_indexed& wdi, int m) noexcept;
constexpr month_weekday_last
operator/(const month& m, const weekday_last& wdl) noexcept;
constexpr month_weekday_last
operator/(int m, const weekday_last& wdl) noexcept;
constexpr month_weekday_last
operator/(const weekday_last& wdl, const month& m) noexcept;
constexpr month_weekday_last
operator/(const weekday_last& wdl, int m) noexcept;
constexpr year_month_day
operator/(const year_month& ym, const day& d) noexcept;
constexpr year_month_day
operator/(const year_month& ym, int d) noexcept;
constexpr year_month_day
operator/(const year& y, const month_day& md) noexcept;
constexpr year_month_day
operator/(int y, const month_day& md) noexcept;
constexpr year_month_day
operator/(const month_day& md, const year& y) noexcept;
constexpr year_month_day
operator/(const month_day& md, int y) noexcept;
constexpr year_month_day_last
operator/(const year_month& ym, last_spec) noexcept;
constexpr year_month_day_last
operator/(const year& y, const month_day_last& mdl) noexcept;
constexpr year_month_day_last
operator/(int y, const month_day_last& mdl) noexcept;
constexpr year_month_day_last
operator/(const month_day_last& mdl, const year& y) noexcept;
constexpr year_month_day_last
operator/(const month_day_last& mdl, int y) noexcept;
constexpr year_month_weekday
operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;
constexpr year_month_weekday
operator/(const year& y, const month_weekday& mwd) noexcept;
constexpr year_month_weekday
operator/(int y, const month_weekday& mwd) noexcept;
constexpr year_month_weekday
operator/(const month_weekday& mwd, const year& y) noexcept;
constexpr year_month_weekday
operator/(const month_weekday& mwd, int y) noexcept;
constexpr year_month_weekday_last
operator/(const year_month& ym, const weekday_last& wdl) noexcept;
constexpr year_month_weekday_last
operator/(const year& y, const month_weekday_last& mwdl) noexcept;
constexpr year_month_weekday_last
operator/(int y, const month_weekday_last& mwdl) noexcept;
constexpr year_month_weekday_last
operator/(const month_weekday_last& mwdl, const year& y) noexcept;
constexpr year_month_weekday_last
operator/(const month_weekday_last& mwdl, int y) noexcept;
// 类模板 hh_mm_ss
template<class Duration> class hh_mm_ss;
template<class CharT, class Traits, class Duration>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const hh_mm_ss<Duration>& hms);
// 12/24 时制函数
constexpr bool is_am(const hours& h) noexcept;
constexpr bool is_pm(const hours& h) noexcept;
constexpr hours make12(const hours& h) noexcept;
constexpr hours make24(const hours& h, bool is_pm) noexcept;
// 时区数据库
struct tzdb;
class tzdb_list;
// 时区数据库访问
const tzdb& get_tzdb();
tzdb_list& get_tzdb_list();
const time_zone* locate_zone(string_view tz_name);
const time_zone* current_zone();
// 远程时区数据库支持
const tzdb& reload_tzdb();
string remote_version();
// 异常类
class nonexistent_local_time;
class ambiguous_local_time;
// 信息类
struct sys_info;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const sys_info& si);
struct local_info;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os, const local_info& li);
// 类 time_zone
enum class choose {earliest, latest};
class time_zone;
bool operator==(const time_zone& x, const time_zone& y) noexcept;
strong_ordering operator<=>(const time_zone& x, const time_zone& y) noexcept;
// 类模板 zoned_traits
template<class T> struct zoned_traits;
// 类模板 zoned_time
template<class Duration, class TimeZonePtr = const time_zone*> class zoned_time;
using zoned_seconds = zoned_time<seconds>;
template<class Duration1, class Duration2, class TimeZonePtr>
bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
const zoned_time<Duration2, TimeZonePtr>& y);
template<class CharT, class Traits, class Duration, class TimeZonePtr>
basic_ostream<CharT, Traits>&
operator<<(basic_ostream<CharT, Traits>& os,
const zoned_time<Duration, TimeZonePtr>& t);
// 闰秒支持
class leap_second;
bool operator==(const leap_second& x, const leap_second& y);
strong_ordering operator<=>(const leap_second& x, const leap_second& y);
template<class Duration>
constexpr bool operator==(const leap_second& x, const sys_time<Duration>& y);
template<class Duration>
constexpr bool operator< (const leap_second& x, const sys_time<Duration>& y);
template<class Duration>
constexpr bool operator< (const sys_time<Duration>& x, const leap_second& y);
template<class Duration>
constexpr bool operator> (const leap_second& x, const sys_time<Duration>& y);
template<class Duration>
constexpr bool operator> (const sys_time<Duration>& x, const leap_second& y);
template<class Duration>
constexpr bool operator<=(const leap_second& x, const sys_time<Duration>& y);
template<class Duration>
constexpr bool operator<=(const sys_time<Duration>& x, const leap_second& y);
template<class Duration>
constexpr bool operator>=(const leap_second& x, const sys_time<Duration>& y);
template<class Duration>
constexpr bool operator>=(const sys_time<Duration>& x, const leap_second& y);
template<class Duration>
requires three_way_comparable_with<sys_seconds, sys_time<Duration>>
constexpr auto operator<=>(const leap_second& x, const sys_time<Duration>& y);
// 类 time_zone_link
class time_zone_link;
bool operator==(const time_zone_link& x, const time_zone_link& y);
strong_ordering operator<=>(const time_zone_link& x, const time_zone_link& y);
// 格式化
template<class Duration> struct /*local-time-format-t*/; // 仅用于阐释
template<class Duration>
/*local-time-format-t*/<Duration>
local_time_format(local_time<Duration> time, const string* abbrev = nullptr,
const seconds* offset_sec = nullptr);
}
template<class Rep, class Period, class CharT>
struct formatter<chrono::duration<Rep, Period>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::sys_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::utc_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::tai_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::gps_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::file_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::local_time<Duration>, CharT>;
template<class Duration, class CharT>
struct formatter<chrono::/*local-time-format-t*/<Duration>, CharT>;
template<class CharT> struct formatter<chrono::day, CharT>;
template<class CharT> struct formatter<chrono::month, CharT>;
template<class CharT> struct formatter<chrono::year, CharT>;
template<class CharT> struct formatter<chrono::weekday, CharT>;
template<class CharT> struct formatter<chrono::weekday_indexed, CharT>;
template<class CharT> struct formatter<chrono::weekday_last, CharT>;
template<class CharT> struct formatter<chrono::month_day, CharT>;
template<class CharT> struct formatter<chrono::month_day_last, CharT>;
template<class CharT> struct formatter<chrono::month_weekday, CharT>;
template<class CharT> struct formatter<chrono::month_weekday_last, CharT>;
template<class CharT> struct formatter<chrono::year_month, CharT>;
template<class CharT> struct formatter<chrono::year_month_day, CharT>;
template<class CharT> struct formatter<chrono::year_month_day_last, CharT>;
template<class CharT> struct formatter<chrono::year_month_weekday, CharT>;
template<class CharT> struct formatter<chrono::year_month_weekday_last, CharT>;
template<class Rep, class Period, class CharT>
struct formatter<chrono::hh_mm_ss<duration<Rep, Period>>, CharT>;
template<class CharT> struct formatter<chrono::sys_info, CharT>;
template<class CharT> struct formatter<chrono::local_info, CharT>;
template<class Duration, class TimeZonePtr, class CharT>
struct formatter<chrono::zoned_time<Duration, TimeZonePtr>, CharT>;
namespace chrono {
// 分析
template<class charT, class Parsable>
/* 未指明 */
parse(const charT* fmt, Parsable& tp);
template<class CharT, class Traits, class Alloc, class Parsable>
/* 未指明 */
parse(const basic_string<CharT, Traits, Alloc>& format, Parsable& tp);
template<class charT, class traits, class Alloc, class Parsable>
/* 未指明 */
parse(const charT* fmt, Parsable& tp,
basic_string<charT, traits, Alloc>& abbrev);
template<class CharT, class Traits, class Alloc, class Parsable>
/* 未指明 */
parse(const basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
basic_string<CharT, Traits, Alloc>& abbrev);
template<class charT, class Parsable>
/* 未指明 */
parse(const charT* fmt, Parsable& tp, minutes& offset);
template<class CharT, class Traits, class Alloc, class Parsable>
/* 未指明 */
parse(const basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
minutes& offset);
template<class charT, class traits, class Alloc, class Parsable>
/* 未指明 */
parse(const charT* fmt, Parsable& tp,
basic_string<charT, traits, Alloc>& abbrev, minutes& offset);
template<class CharT, class Traits, class Alloc, class Parsable>
/* 未指明 */
parse(const basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
basic_string<CharT, Traits, Alloc>& abbrev, minutes& offset);
// 日历常量
inline constexpr last_spec last{};
inline constexpr weekday Sunday{0};
inline constexpr weekday Monday{1};
inline constexpr weekday Tuesday{2};
inline constexpr weekday Wednesday{3};
inline constexpr weekday Thursday{4};
inline constexpr weekday Friday{5};
inline constexpr weekday Saturday{6};
inline constexpr month January{1};
inline constexpr month February{2};
inline constexpr month March{3};
inline constexpr month April{4};
inline constexpr month May{5};
inline constexpr month June{6};
inline constexpr month July{7};
inline constexpr month August{8};
inline constexpr month September{9};
inline constexpr month October{10};
inline constexpr month November{11};
inline constexpr month December{12};
}
inline namespace literals {
inline namespace chrono_literals {
// 时长字面量后缀
constexpr chrono::hours operator""h(unsigned long long);
constexpr chrono::duration</* 未指明 */,
ratio<3600, 1>> operator""h(long double);
constexpr chrono::minutes operator""min(unsigned long long);
constexpr chrono::duration</* 未指明 */,
ratio<60, 1>> operator""min(long double);
constexpr chrono::seconds operator""s(unsigned long long);
constexpr chrono::duration</* 未指明 */> operator""s(long double);
constexpr chrono::milliseconds operator""ms(unsigned long long);
constexpr chrono::duration</* 未指明 */, milli> operator""ms(long double);
constexpr chrono::microseconds operator""us(unsigned long long);
constexpr chrono::duration</* 未指明 */, micro> operator""us(long double);
constexpr chrono::nanoseconds operator""ns(unsigned long long);
constexpr chrono::duration</* 未指明 */, nano> operator""ns(long double);
// 非成员函数
constexpr chrono::day operator""d(unsigned long long d) noexcept;
// 非成员函数
constexpr chrono::year operator""y(unsigned long long y) noexcept;
}
}
namespace chrono {
using namespace literals::chrono_literals;
}
// 散列支持
template<class T> struct hash;
template<class Rep, class Period>
struct hash<chrono::duration<Rep, Period>>;
template<class Clock, class Duration>
struct hash<chrono::time_point<Clock, Duration>>;
template<> struct hash<chrono::day>;
template<> struct hash<chrono::month>;
template<> struct hash<chrono::year>;
template<> struct hash<chrono::weekday>;
template<> struct hash<chrono::weekday_indexed>;
template<> struct hash<chrono::weekday_last>;
template<> struct hash<chrono::month_day>;
template<> struct hash<chrono::month_day_last>;
template<> struct hash<chrono::month_weekday>;
template<> struct hash<chrono::month_weekday_last>;
template<> struct hash<chrono::year_month>;
template<> struct hash<chrono::year_month_day>;
template<> struct hash<chrono::year_month_day_last>;
template<> struct hash<chrono::year_month_weekday>;
template<> struct hash<chrono::year_month_weekday_last>;
template<class Duration, class TimeZonePtr>
struct hash<chrono::zoned_time<Duration, TimeZonePtr>>;
template<> struct hash<chrono::leap_second>;
}