Files
2025-10-25 03:02:53 +03:00

517 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[time.zone.zonedtime]
# 30 Time library [[time]](./#time)
## 30.11 Time zones [[time.zone]](time.zone#zonedtime)
### 30.11.7 Class template zoned_time [time.zone.zonedtime]
#### [30.11.7.1](#overview) Overview [[time.zone.zonedtime.overview]](time.zone.zonedtime.overview)
namespace std::chrono {template<class Duration, class TimeZonePtr = const time_zone*>class zoned_time {public:using duration = common_type_t<Duration, seconds>; private: TimeZonePtr zone_; // *exposition only* sys_time<duration> tp_; // *exposition only*using traits = zoned_traits<TimeZonePtr>; // *exposition only*public: zoned_time();
zoned_time(const zoned_time&) = default;
zoned_time& operator=(const zoned_time&) = default;
zoned_time(const sys_time<Duration>& st); explicit zoned_time(TimeZonePtr z); explicit zoned_time(string_view name); template<class Duration2> zoned_time(const zoned_time<Duration2, TimeZonePtr>& y);
zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
zoned_time(string_view name, const sys_time<Duration>& st);
zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
zoned_time(string_view name, const local_time<Duration>& tp);
zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
zoned_time(string_view name, const local_time<Duration>& tp, choose c); template<class Duration2, class TimeZonePtr2> zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y); template<class Duration2, class TimeZonePtr2> zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y, choose); template<class Duration2, class TimeZonePtr2> zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y); template<class Duration2, class TimeZonePtr2> zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y, choose c);
zoned_time& operator=(const sys_time<Duration>& st);
zoned_time& operator=(const local_time<Duration>& lt); operator sys_time<duration>() const; explicit operator local_time<duration>() const;
TimeZonePtr get_time_zone() const;
local_time<duration> get_local_time() const;
sys_time<duration> get_sys_time() const;
sys_info get_info() const; };
zoned_time() -> zoned_time<seconds>; template<class Duration> zoned_time(sys_time<Duration>)-> zoned_time<common_type_t<Duration, seconds>>; template<class TimeZonePtrOrName>using *time-zone-representation* = // *exposition only* conditional_t<is_convertible_v<TimeZonePtrOrName, string_view>, const time_zone*,
remove_cvref_t<TimeZonePtrOrName>>; template<class TimeZonePtrOrName> zoned_time(TimeZonePtrOrName&&)-> zoned_time<seconds, *time-zone-representation*<TimeZonePtrOrName>>; template<class TimeZonePtrOrName, class Duration> zoned_time(TimeZonePtrOrName&&, sys_time<Duration>)-> zoned_time<common_type_t<Duration, seconds>, *time-zone-representation*<TimeZonePtrOrName>>; template<class TimeZonePtrOrName, class Duration> zoned_time(TimeZonePtrOrName&&, local_time<Duration>,
choose = choose::earliest)-> zoned_time<common_type_t<Duration, seconds>, *time-zone-representation*<TimeZonePtrOrName>>; template<class Duration, class TimeZonePtrOrName, class TimeZonePtr2> zoned_time(TimeZonePtrOrName&&, zoned_time<Duration, TimeZonePtr2>,
choose = choose::earliest)-> zoned_time<common_type_t<Duration, seconds>, *time-zone-representation*<TimeZonePtrOrName>>;}
[1](#overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9701)
zoned_time represents a logical pairing of
a time_zone and a time_point with precision Duration[.](#overview-1.sentence-1)
zoned_time<Duration> maintains the invariant that
it always refers to a valid time zone and
represents a point in time that exists and is not ambiguous
in that time zone[.](#overview-1.sentence-2)
[2](#overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9709)
If Duration is not a specialization of chrono::duration,
the program is ill-formed[.](#overview-2.sentence-1)
[3](#overview-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9713)
Every constructor of zoned_time that
accepts a string_view as its first parameter
does not participate in
class template argument deduction ([[over.match.class.deduct]](over.match.class.deduct "12.2.2.9Class template argument deduction"))[.](#overview-3.sentence-1)
#### [30.11.7.2](#ctor) Constructors [[time.zone.zonedtime.ctor]](time.zone.zonedtime.ctor)
[🔗](#lib:zoned_time,constructor)
`zoned_time();
`
[1](#ctor-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9727)
*Constraints*: traits::default_zone() is a well-formed expression[.](#ctor-1.sentence-1)
[2](#ctor-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9731)
*Effects*: Initializes zone_ with traits::default_zone() and
default constructs tp_[.](#ctor-2.sentence-1)
[🔗](#ctor-itemdecl:2)
`zoned_time(const sys_time<Duration>& st);
`
[3](#ctor-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9742)
*Constraints*: traits::default_zone() is a well-formed expression[.](#ctor-3.sentence-1)
[4](#ctor-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9746)
*Effects*: Initializes zone_ with traits::default_zone() and tp_ with st[.](#ctor-4.sentence-1)
[🔗](#ctor-itemdecl:3)
`explicit zoned_time(TimeZonePtr z);
`
[5](#ctor-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9756)
*Preconditions*: z refers to a time zone[.](#ctor-5.sentence-1)
[6](#ctor-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9760)
*Effects*: Initializes zone_ with std::move(z) and
default constructs tp_[.](#ctor-6.sentence-1)
[🔗](#ctor-itemdecl:4)
`explicit zoned_time(string_view name);
`
[7](#ctor-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9771)
*Constraints*: traits::locate_zone(string_view{}) is a well-formed expression andzoned_time is constructible from the return type of traits::locate_zone(string_view{})[.](#ctor-7.sentence-1)
[8](#ctor-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9776)
*Effects*: Initializes zone_ with traits::locate_zone(name) and
default constructs tp_[.](#ctor-8.sentence-1)
[🔗](#ctor-itemdecl:5)
`template<class Duration2>
zoned_time(const zoned_time<Duration2, TimeZonePtr>& y);
`
[9](#ctor-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9788)
*Constraints*: is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is true[.](#ctor-9.sentence-1)
[10](#ctor-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9792)
*Effects*: Initializes zone_ with y.zone_ and tp_ with y.tp_[.](#ctor-10.sentence-1)
[🔗](#ctor-itemdecl:6)
`zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
`
[11](#ctor-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9802)
*Preconditions*: z refers to a time zone[.](#ctor-11.sentence-1)
[12](#ctor-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9806)
*Effects*: Initializes zone_ with std::move(z) and tp_ with st[.](#ctor-12.sentence-1)
[🔗](#ctor-itemdecl:7)
`zoned_time(string_view name, const sys_time<Duration>& st);
`
[13](#ctor-13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9816)
*Constraints*: zoned_time is constructible from the return type of traits::locate_zone(name) and st[.](#ctor-13.sentence-1)
[14](#ctor-14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9820)
*Effects*: Equivalent to construction with {traits::locate_zone(name), st}[.](#ctor-14.sentence-1)
[🔗](#ctor-itemdecl:8)
`zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
`
[15](#ctor-15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9830)
*Constraints*: is_convertible_v<decltype(declval<TimeZonePtr&>()->to_sys(local_time<Duration>{})),
sys_time<duration>> is true[.](#ctor-15.sentence-1)
[16](#ctor-16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9839)
*Preconditions*: z refers to a time zone[.](#ctor-16.sentence-1)
[17](#ctor-17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9843)
*Effects*: Initializes zone_ with std::move(z) and tp_ with zone_->to_sys(tp)[.](#ctor-17.sentence-1)
[🔗](#ctor-itemdecl:9)
`zoned_time(string_view name, const local_time<Duration>& tp);
`
[18](#ctor-18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9853)
*Constraints*: zoned_time is constructible from the return type of traits::locate_zone(name) and tp[.](#ctor-18.sentence-1)
[19](#ctor-19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9857)
*Effects*: Equivalent to construction with {traits::locate_zone(name), tp}[.](#ctor-19.sentence-1)
[🔗](#ctor-itemdecl:10)
`zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
`
[20](#ctor-20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9867)
*Constraints*: is_convertible_v<decltype(declval<TimeZonePtr&>()->to_sys(local_time<Duration>{}, choose::earliest)),
sys_time<duration>> is true[.](#ctor-20.sentence-1)
[21](#ctor-21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9876)
*Preconditions*: z refers to a time zone[.](#ctor-21.sentence-1)
[22](#ctor-22)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9880)
*Effects*: Initializes zone_ with std::move(z) and tp_ with zone_->to_sys(tp, c)[.](#ctor-22.sentence-1)
[🔗](#ctor-itemdecl:11)
`zoned_time(string_view name, const local_time<Duration>& tp, choose c);
`
[23](#ctor-23)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9890)
*Constraints*: zoned_time is constructible from
the return type of traits::locate_zone(name), local_time<Duration>, and choose[.](#ctor-23.sentence-1)
[24](#ctor-24)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9895)
*Effects*: Equivalent to construction with {traits::locate_zone(name), tp, c}[.](#ctor-24.sentence-1)
[🔗](#ctor-itemdecl:12)
`template<class Duration2, class TimeZonePtr2>
zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y);
`
[25](#ctor-25)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9906)
*Constraints*: is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is true[.](#ctor-25.sentence-1)
[26](#ctor-26)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9910)
*Preconditions*: z refers to a valid time zone[.](#ctor-26.sentence-1)
[27](#ctor-27)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9914)
*Effects*: Initializes zone_ with std::move(z) and tp_ with y.tp_[.](#ctor-27.sentence-1)
[🔗](#ctor-itemdecl:13)
`template<class Duration2, class TimeZonePtr2>
zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y, choose);
`
[28](#ctor-28)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9925)
*Constraints*: is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is true[.](#ctor-28.sentence-1)
[29](#ctor-29)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9929)
*Preconditions*: z refers to a valid time zone[.](#ctor-29.sentence-1)
[30](#ctor-30)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9933)
*Effects*: Equivalent to construction with {z, y}[.](#ctor-30.sentence-1)
[31](#ctor-31)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9937)
[*Note [1](#ctor-note-1)*:
The choose parameter has no effect[.](#ctor-31.sentence-1)
— *end note*]
[🔗](#ctor-itemdecl:14)
`template<class Duration2, class TimeZonePtr2>
zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y);
`
[32](#ctor-32)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9949)
*Constraints*: zoned_time is constructible from
the return type of traits::locate_zone(name) and
the type zoned_time<Duration2, TimeZonePtr2>[.](#ctor-32.sentence-1)
[33](#ctor-33)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9955)
*Effects*: Equivalent to construction with {traits::locate_zone(name), y}[.](#ctor-33.sentence-1)
[🔗](#ctor-itemdecl:15)
`template<class Duration2, class TimeZonePtr2>
zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y, choose c);
`
[34](#ctor-34)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9966)
*Constraints*: zoned_time is constructible from
the return type of traits::locate_zone(name),
the type zoned_time<Duration2, TimeZonePtr2>, and
the type choose[.](#ctor-34.sentence-1)
[35](#ctor-35)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9973)
*Effects*: Equivalent to construction with {traits::locate_zone(name), y, c}[.](#ctor-35.sentence-1)
[36](#ctor-36)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9977)
[*Note [2](#ctor-note-2)*:
The choose parameter has no effect[.](#ctor-36.sentence-1)
— *end note*]
#### [30.11.7.3](#members) Member functions [[time.zone.zonedtime.members]](time.zone.zonedtime.members)
[🔗](#lib:operator=,zoned_time)
`zoned_time& operator=(const sys_time<Duration>& st);
`
[1](#members-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9992)
*Effects*: After assignment, get_sys_time() == st[.](#members-1.sentence-1)
This assignment has no effect on the return value of get_time_zone()[.](#members-1.sentence-2)
[2](#members-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L9997)
*Returns*: *this[.](#members-2.sentence-1)
[🔗](#lib:operator=,zoned_time_)
`zoned_time& operator=(const local_time<Duration>& lt);
`
[3](#members-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10008)
*Effects*: After assignment, get_local_time() == lt[.](#members-3.sentence-1)
This assignment has no effect on the return value of get_time_zone()[.](#members-3.sentence-2)
[4](#members-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10013)
*Returns*: *this[.](#members-4.sentence-1)
[🔗](#lib:operator_sys_time,zoned_time)
`operator sys_time<duration>() const;
`
[5](#members-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10024)
*Returns*: get_sys_time()[.](#members-5.sentence-1)
[🔗](#lib:operator_local_time,zoned_time)
`explicit operator local_time<duration>() const;
`
[6](#members-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10035)
*Returns*: get_local_time()[.](#members-6.sentence-1)
[🔗](#lib:get_time_zone,zoned_time)
`TimeZonePtr get_time_zone() const;
`
[7](#members-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10046)
*Returns*: zone_[.](#members-7.sentence-1)
[🔗](#lib:get_local_time,zoned_time)
`local_time<duration> get_local_time() const;
`
[8](#members-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10057)
*Returns*: zone_->to_local(tp_)[.](#members-8.sentence-1)
[🔗](#lib:get_sys_time,zoned_time)
`sys_time<duration> get_sys_time() const;
`
[9](#members-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10068)
*Returns*: tp_[.](#members-9.sentence-1)
[🔗](#lib:get_info,zoned_time)
`sys_info get_info() const;
`
[10](#members-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10079)
*Returns*: zone_->get_info(tp_)[.](#members-10.sentence-1)
#### [30.11.7.4](#nonmembers) Non-member functions [[time.zone.zonedtime.nonmembers]](time.zone.zonedtime.nonmembers)
[🔗](#lib:operator==,zoned_time)
`template<class Duration1, class Duration2, class TimeZonePtr>
bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
const zoned_time<Duration2, TimeZonePtr>& y);
`
[1](#nonmembers-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10094)
*Returns*: x.zone_ == y.zone_ && x.tp_ == y.tp_[.](#nonmembers-1.sentence-1)
[🔗](#lib:operator%3c%3c,zoned_time)
`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);
`
[2](#nonmembers-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L10108)
*Effects*: Equivalent to:return os << format(os.getloc(), *STATICALLY-WIDEN*<charT>("{:L%F %T %Z}"), t);