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_;
sys_time<duration> tp_;
using traits = zoned_traits<TimeZonePtr>;
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 =
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>>;
}
zoned_time represents a logical pairing of
a
time_zone and a
time_point with precision
Duration. 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
. If
Duration is not a specialization of
chrono::duration,
the program is ill-formed
.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])
.Constraints:
traits::default_zone() is a well-formed expression
. Effects: Initializes
zone_ with
traits::default_zone() and
default constructs
tp_. zoned_time(const sys_time<Duration>& st);
Constraints:
traits::default_zone() is a well-formed expression
. Effects: Initializes
zone_ with
traits::default_zone() and
tp_ with
st. explicit zoned_time(TimeZonePtr z);
Preconditions:
z refers to a time zone
. Effects: Initializes
zone_ with
std::move(z) and
default constructs
tp_. explicit zoned_time(string_view name);
Constraints:
traits::locate_zone(string_view{}) is a well-formed expression and
zoned_time is constructible from the return type of
traits::locate_zone(string_view{}). Effects: Initializes
zone_ with
traits::locate_zone(name) and
default constructs
tp_. template<class Duration2>
zoned_time(const zoned_time<Duration2, TimeZonePtr>& y);
Constraints:
is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is
true. Effects: Initializes
zone_ with
y.zone_ and
tp_ with
y.tp_. zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
Preconditions:
z refers to a time zone
. Effects: Initializes
zone_ with
std::move(z) and
tp_ with
st. zoned_time(string_view name, const sys_time<Duration>& st);
Constraints:
zoned_time is constructible from the return type of
traits::locate_zone(name) and
st. Effects: Equivalent to construction with
{traits::locate_zone(name), st}. zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
Constraints:
is_convertible_v<
decltype(declval<TimeZonePtr&>()->to_sys(local_time<Duration>{})),
sys_time<duration>>
is
true. Preconditions:
z refers to a time zone
. Effects: Initializes
zone_ with
std::move(z) and
tp_ with
zone_->to_sys(tp). zoned_time(string_view name, const local_time<Duration>& tp);
Constraints:
zoned_time is constructible from the return type of
traits::locate_zone(name) and
tp. Effects: Equivalent to construction with
{traits::locate_zone(name), tp}. zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
Constraints:
is_convertible_v<
decltype(declval<TimeZonePtr&>()->to_sys(local_time<Duration>{}, choose::earliest)),
sys_time<duration>>
is
true. Preconditions:
z refers to a time zone
. Effects: Initializes
zone_ with
std::move(z) and
tp_ with
zone_->to_sys(tp, c). zoned_time(string_view name, const local_time<Duration>& tp, choose c);
Constraints:
zoned_time is constructible from
the return type of
traits::locate_zone(name),
local_time<Duration>, and
choose. Effects: Equivalent to construction with
{traits::locate_zone(name), tp, c}. template<class Duration2, class TimeZonePtr2>
zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y);
Constraints:
is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is
true. Preconditions:
z refers to a valid time zone
. Effects: Initializes
zone_ with
std::move(z) and
tp_ with
y.tp_. template<class Duration2, class TimeZonePtr2>
zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& y, choose);
Constraints:
is_convertible_v<sys_time<Duration2>, sys_time<Duration>> is
true. Preconditions:
z refers to a valid time zone
. Effects: Equivalent to construction with
{z, y}. [
Note 1:
The
choose parameter has no effect
. —
end note]
template<class Duration2, class TimeZonePtr2>
zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y);
Constraints:
zoned_time is constructible from
the return type of
traits::locate_zone(name) and
the type
zoned_time<Duration2, TimeZonePtr2>. Effects: Equivalent to construction with
{traits::locate_zone(name), y}. template<class Duration2, class TimeZonePtr2>
zoned_time(string_view name, const zoned_time<Duration2, TimeZonePtr2>& y, choose c);
Constraints:
zoned_time is constructible from
the return type of
traits::locate_zone(name),
the type
zoned_time<Duration2, TimeZonePtr2>, and
the type
choose. Effects: Equivalent to construction with
{traits::locate_zone(name), y, c}. [
Note 2:
The
choose parameter has no effect
. —
end note]
zoned_time& operator=(const sys_time<Duration>& st);
Effects: After assignment,
get_sys_time() == st. This assignment has no effect on the return value of
get_time_zone().zoned_time& operator=(const local_time<Duration>& lt);
Effects: After assignment,
get_local_time() == lt. This assignment has no effect on the return value of
get_time_zone().operator sys_time<duration>() const;
explicit operator local_time<duration>() const;
Returns:
get_local_time(). TimeZonePtr get_time_zone() const;
local_time<duration> get_local_time() const;
Returns:
zone_->to_local(tp_). sys_time<duration> get_sys_time() const;
sys_info get_info() const;
Returns:
zone_->get_info(tp_). template<class Duration1, class Duration2, class TimeZonePtr>
bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
const zoned_time<Duration2, TimeZonePtr>& y);
Returns:
x.zone_ == y.zone_ && x.tp_ == y.tp_. 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);
Effects: Equivalent to:
return os << format(os.getloc(), STATICALLY-WIDEN<charT>("{:L%F %T %Z}"), t);