Skip to content

Commit fab9a7a

Browse files
TylerMSFTTylerMSFT
andauthored
new local_info_struct & sys_info_struct plus updates (#3762)
* new local_info_struct & sys_info_struct plus updates * acrolinx * finish draft of local_info and sys_info, and update time_zone with an example of how to get one * fix typos * stash work so far on zoned_time class * draft stub * fix merge conflicts * tech review * add choose-enum, more zoned_time class work * draft zoned_time * read through fixes * acrolinx * cleanup * a little word smithing * tech review * acrolinx and last of tech review Co-authored-by: TylerMSFT <[email protected]>
1 parent b095d81 commit fab9a7a

25 files changed

+1009
-153
lines changed

docs/standard-library/bit-enum.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ ms.date: "08/27/2020"
55
f1_keywords: ["bit/std::endian"]
66
helpviewer_keywords: ["std::endian"]
77
---
8-
# endian enum
8+
9+
# `endian` enum
910

1011
Indicates the endianness of all scalar types.
1112

@@ -32,12 +33,12 @@ All native scalar types are little-endian for the platforms that Microsoft Visua
3233
3334
## Requirements
3435
35-
**Header:** \<bit>
36+
**Header:** `<bit>`
3637
37-
**Namespace:** std
38+
**Namespace:** `std`
3839
39-
[`/std:c++20`](../build/reference/std-specify-language-standard-version.md) or later is required.
40+
Compiler option: [`/std:c++20`](../build/reference/std-specify-language-standard-version.md) or later is required.
4041
4142
## See also
4243
43-
[\<bit>](../standard-library/bit.md)
44+
[`<bit>`](../standard-library/bit.md)

docs/standard-library/choose-enum.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
title: "choose enum"
3+
description: "enum used to specify how to handle ambiguous or nonexistent local times when resolving a time in a time zone"
4+
ms.date: 09/16/2021
5+
f1_keywords: ["chrono/std::choose"]
6+
helpviewer_keywords: ["std::choose"]
7+
---
8+
9+
# `choose` enum
10+
11+
Used with [`time_zone`](time-zone-class.md) and [`zoned_time`](zoned-time-class.md) to indicate how to handle ambiguous or nonexistent local times when resolving a time in a time zone.
12+
13+
## Syntax
14+
15+
```cpp
16+
enum class choose { // C++ 20
17+
earliest,
18+
latest
19+
};
20+
```
21+
22+
### Members
23+
24+
|Element|Description|
25+
|-|-|
26+
| `earliest` | If a time conversion in a time zone is ambiguous or nonexistent, uses the earlier time point. |
27+
| `latest` | If a time conversion in a time zone is ambiguous or nonexistent, uses the later time point. |
28+
29+
## Remarks
30+
31+
If a local time doesn't exist for the time zone, `earliest` and `latest` result in the same time point.
32+
When `choose` isn't passed and an ambiguous or nonexistent time results, either the exception `std::chrono::ambiguous_local_time` or `std::chrono::nonexistent_local_time` is thrown, respectively.
33+
34+
## Requirements
35+
36+
**Header:** `<chrono>` (since C++20)
37+
38+
**Namespace:** `std::chrono`
39+
40+
Compiler option:[`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) is required.
41+
42+
## See also
43+
44+
[`time_zone`](time-zone-class.md)\
45+
[`zoned_time`](zoned-time-class.md)

docs/standard-library/chrono-operators.md

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
description: "Learn more about: &lt;chrono&gt; operators"
33
title: "&lt;chrono&gt; operators"
4-
ms.date: 09/02/2021
5-
f1_keywords: ["chrono/std::operator modulo", "chrono/std::operator+", "chrono/std::chrono::day::operator+", "chrono/std::chrono::duration::operator+", "chrono/std::chrono::month::operator+", "chrono/std::chrono::time_point::operator+", "chrono/std::chrono::weekday::operator+", "chrono/std::chrono::year_month::operator+", "chrono/std::chrono::year::operator+", "chrono/std::chrono::year_month_day::operator+", "chrono/std::chrono::year_month_day_last::operator+", "chrono/std::chrono::year_month_weekday::operator+", "chrono/std::chrono::year_month_weekday_last::operator+", "chrono/std::operator!=", "chrono/std::operator*", "chrono/std::operator/", "chrono/std::operator-", "chrono/std::operator<", "chrono/std::operator<=", "chrono/std::operator<", "chrono/std::operator==", "chrono/std::operator>>", "chrono/std::operator<=>", "chrono/std::chrono::day::operator<=>", "chrono/std::chrono::month::operator<=>", "chrono/std::chrono::year::operator<=>", "chrono/std::chrono::year_month::operator<=>", "chrono/std::chrono::time_point::operator<=>", "chrono/std::chrono::time_zone_link::operator<=>", "chrono/std::chrono::time_zone_link::operator==", "chrono/std::chrono::duration::operator<=>", "chrono/std::chrono::month_day_last::operator<=>", "chrono/std::chrono::year_month_day_last::operator<=>", "chrono/std::operator==", "chrono/std::chrono::year::operator<==>", "chrono/std::chrono::day::operator==", "chrono/std::chrono::duration::operator==", "chrono/std::chrono::month::operator==", "chrono/std::chrono::month_day::operator==", "chrono/std::chrono::month_day_last::operator==", "chrono/std::chrono::month_weekday::operator==", "chrono/std::chrono::month_weekday_last::operator==", "chrono/std::chrono::time_point::operator==", "chrono/std::chrono::weekday::operator==", "chrono/std::chrono::year_month::operator==", "chrono/std::chrono::year::operator==", "chrono/std::chrono::year_month_day::operator==", "chrono/std::chrono::year_month_day_last::operator==", "chrono/std::chrono::year_month_weekday_last::operator==", "chrono/std::chrono::year_month_weekday::operator==", "chrono/std::chrono::month_weekday_last::operator==", "chrono/std::chrono::weekday::operator==", "chrono/std::chrono::weekday_last::operator==", "chrono/std::chrono::year_month_weekday_indexed::operator==", "chrono/std::chrono::year_month_weekday_last::operator==", "chrono/std::chrono::year::operator==", "chrono/std::chrono::year_month::operator==", "chrono/std::chrono::year_month_day::operator==", "chrono/std::chrono::year_month_day_last::operator==", "chrono/std::operator-", "chrono/std::chrono::day::operator-", "chrono/std::chrono::duration::operator-", "chrono/std::chrono::month::operator-", "chrono/std::chrono::time_point::operator-", "chrono/std::chrono::weekday::operator-", "chrono/std::chrono::year_month::operator-", "chrono/std::chrono::year::operator-", "chrono/std::chrono::year_month_day::operator-", "chrono/std::chrono::year_month_day_last::operator-", "chrono/std::chrono::year_month_weekday::operator-", "chrono/std::chrono::year_month_weekday_last::operator-", "chrono/std::chrono::day::operator<<", "chrono/std::chrono::hh_mm_ss::operator<<", "chrono/std::chrono::month_day::operator<<", "chrono/std::chrono::month_day_last::operator<<", "chrono/std::chrono::month_weekday::operator<<", "chrono/std::chrono::month_weekday_last::operator<<", "chrono/std::chrono::weekday::operator<<", "chrono/std::chrono::weekday_indexed::operator<<", "chrono/std::chrono::weekday_last::operator<<", "chrono/std::chrono::year::operator<<", "chrono/std::chrono::year_month_day::operator<<", "chrono/std::chrono::year_month_day_last::operator<<", "chrono/std::chrono::year_month_weekday::operator<<", "chrono/std::chrono::utc_time::operator<<", "chrono/std::chrono::tai_time::operator<<", "chrono/std::chrono::gps_time::operator<<", "chrono/std::chrono::local_time::operator<<", "chrono/std::chrono::file_time::operator<<"]
4+
ms.date: 09/17/2021
5+
f1_keywords: ["chrono/std::operator modulo", "chrono/std::operator+", "chrono/std::chrono::day::operator+", "chrono/std::chrono::duration::operator+", "chrono/std::chrono::month::operator+", "chrono/std::chrono::time_point::operator+", "chrono/std::chrono::weekday::operator+", "chrono/std::chrono::year_month::operator+", "chrono/std::chrono::year::operator+", "chrono/std::chrono::year_month_day::operator+", "chrono/std::chrono::year_month_day_last::operator+", "chrono/std::chrono::year_month_weekday::operator+", "chrono/std::chrono::year_month_weekday_last::operator+", "chrono/std::operator!=", "chrono/std::operator*", "chrono/std::operator/", "chrono/std::operator-", "chrono/std::operator<", "chrono/std::operator<=", "chrono/std::operator<", "chrono/std::operator==", "chrono/std::operator>>", "chrono/std::operator<=>", "chrono/std::chrono::day::operator<=>", "chrono/std::chrono::month::operator<=>", "chrono/std::chrono::year::operator<=>", "chrono/std::chrono::year_month::operator<=>", "chrono/std::chrono::time_point::operator<=>", "chrono/std::chrono::time_zone_link::operator<=>", "chrono/std::chrono::time_zone_link::operator==", "chrono/std::chrono::duration::operator<=>", "chrono/std::chrono::month_day_last::operator<=>", "chrono/std::chrono::year_month_day_last::operator<=>", "chrono/std::operator==", "chrono/std::chrono::year::operator<==>", "chrono/std::chrono::day::operator==", "chrono/std::chrono::duration::operator==", "chrono/std::chrono::month::operator==", "chrono/std::chrono::month_day::operator==", "chrono/std::chrono::month_day_last::operator==", "chrono/std::chrono::month_weekday::operator==", "chrono/std::chrono::month_weekday_last::operator==", "chrono/std::chrono::time_point::operator==", "chrono/std::chrono::weekday::operator==", "chrono/std::chrono::year_month::operator==", "chrono/std::chrono::year::operator==", "chrono/std::chrono::year_month_day::operator==", "chrono/std::chrono::year_month_day_last::operator==", "chrono/std::chrono::year_month_weekday_last::operator==", "chrono/std::chrono::year_month_weekday::operator==", "chrono/std::chrono::month_weekday_last::operator==", "chrono/std::chrono::weekday::operator==", "chrono/std::chrono::weekday_last::operator==", "chrono/std::chrono::year_month_weekday_indexed::operator==", "chrono/std::chrono::year_month_weekday_last::operator==", "chrono/std::chrono::year::operator==", "chrono/std::chrono::year_month::operator==", "chrono/std::chrono::year_month_day::operator==", "chrono/std::chrono::year_month_day_last::operator==", "chrono/std::chrono::zoned_time::operator==", "chrono/std::operator-", "chrono/std::chrono::day::operator-", "chrono/std::chrono::duration::operator-", "chrono/std::chrono::month::operator-", "chrono/std::chrono::time_point::operator-", "chrono/std::chrono::weekday::operator-", "chrono/std::chrono::year_month::operator-", "chrono/std::chrono::year::operator-", "chrono/std::chrono::year_month_day::operator-", "chrono/std::chrono::year_month_day_last::operator-", "chrono/std::chrono::year_month_weekday::operator-", "chrono/std::chrono::year_month_weekday_last::operator-", "chrono/std::chrono::day::operator<<", "chrono/std::chrono::hh_mm_ss::operator<<", "chrono/std::chrono::month_day::operator<<", "chrono/std::chrono::month_day_last::operator<<", "chrono/std::chrono::month_weekday::operator<<", "chrono/std::chrono::month_weekday_last::operator<<", "chrono/std::chrono::weekday::operator<<", "chrono/std::chrono::weekday_indexed::operator<<", "chrono/std::chrono::weekday_last::operator<<", "chrono/std::chrono::year::operator<<", "chrono/std::chrono::year_month_day::operator<<", "chrono/std::chrono::year_month_day_last::operator<<", "chrono/std::chrono::year_month_weekday::operator<<", "chrono/std::chrono::utc_time::operator<<", "chrono/std::chrono::tai_time::operator<<", "chrono/std::chrono::gps_time::operator<<", "chrono/std::chrono::local_time::operator<<", "chrono/std::chrono::file_time::operator<<", "chrono/std::chrono::sys_info::operator<<", "chrono/std::chrono::local_info::operator<<", "chrono/std::chrono::zoned_time::operator<<"]
66
---
77
# `<chrono>` operators
88

@@ -568,7 +568,8 @@ Determines whether:
568568
15\) [`year_month_day_last`](year-month-day-last-class.md) represent the same last day of the year and month.\
569569
16\) [`year_month_weekday`](year-month-weekday-class.md) represent the same weekday, year, and month.\
570570
17\) [`year_month_weekday_last`](year-month-weekday-last-class.md) represent the same last weekday of the month, year, and month.\
571-
18\) [`time_zone_link`](time-zone-link-class.md) have the same `name`. The `target` name isn't considered.
571+
18\) [`time_zone_link`](time-zone-link-class.md) have the same `name`. The `target` name isn't considered.\
572+
19\) [`zoned_time`](zoned-time-class.md) represent the same time and time zone.
572573

573574
```cpp
574575
// 1) duration<Rep, Period>
@@ -630,6 +631,10 @@ constexpr bool operator==(const year_month_weekday_last& Left, const year_month_
630631

631632
// 18) time_zone_link
632633
bool operator==(const time_zone_link& Left, const time_zone_link& Right) noexcept;
634+
635+
// 19) zoned_time
636+
template <class Duration1, class Duration2, class TimeZonePtr>
637+
bool operator==(const zoned_time<Duration1, TimeZonePtr>& Left, const zoned_time<Duration2, TimeZonePtr>& Right); // C++ 20
633638
```
634639
635640
### Parameters
@@ -645,7 +650,8 @@ The right object to compare.
645650
1\) Returns **`true`** if *`Left`* and *`Right`* represent time intervals that have the same length. Otherwise, returns **`false`**.\
646651
2\) Returns **`true`** if *`Left`* and *`Right`* represent the same point in time. Otherwise, returns **`false`**.\
647652
3-17\) Returns **`true`** if *`Left`* and *`Right`* have the same value. Otherwise, returns **`false`**.\
648-
18\) Returns **`true`** if `Left.name() == Right.name()`. Otherwise, returns `*false*`.
653+
18\) Returns **`true`** if `Left.name() == Right.name()`. Otherwise, returns `*false*`.\
654+
19\) Returns **`true`** if `Left.get_time_zone() == _Right.get_time_zone() && Left.get_sys_time() == Right.get_sys_time();`
649655
650656
## <a name="op_gt"></a> `operator>`
651657
@@ -705,7 +711,7 @@ Each function returns `!(Left < Right)`.
705711
706712
## <a name="op_spaceship"></a> `operator<=>`
707713
708-
The spaceship operator, in conjunction with `operator==`, synthesizes operators for `<`, `<=`, `>`, `>=`, and `!=` for the following types:
714+
The spaceship operator, with `operator==`, synthesizes operators for `<`, `<=`, `>`, `>=`, and `!=` for the following types:
709715
710716
- [`day`](day-class.md)
711717
- [`duration`](duration-class.md)
@@ -823,11 +829,13 @@ Output the following types to a stream:
823829
- [`gps_time`](gps-clock-class.md)
824830
- [`hh_mm_ss`](hhmmss-class.md)
825831
- [`local_time`](local_t.md)
832+
- [`local_info`](local-info-struct.md)
826833
- [`month`](month-class.md)
827834
- [`month_day`](month-day-class.md)
828835
- [`month_day_last`](month-day-last-class.md)
829836
- [`month_weekday`](month-weekday-class.md)
830837
- [`month_weekday_last`](month-weekday-last-class.md)
838+
- [`sys_info`](sys-info-struct.md)
831839
- [`tai_time`](tai-clock-class.md)
832840
- [`utc_time`](utc-clock-class.md)
833841
- [`weekday`](weekday-class.md)
@@ -839,6 +847,7 @@ Output the following types to a stream:
839847
- [`year_month_day_last`](year-month-day-last-class.md)
840848
- [`year_month_weekday`](year-month-weekday-class.md)
841849
- [`year_month_weekday_last`](year-month-weekday-last-class.md)
850+
- [`zoned_time`](zoned-time-class.md)
842851

843852
```cpp
844853
// 1) day
@@ -940,6 +949,21 @@ operator<<(basic_ostream<CharT, Traits>& os, const gps_time<Duration>& t); // C+
940949
template<class CharT, class Traits, class Duration>
941950
basic_ostream<CharT, Traits>&
942951
operator<<(basic_ostream<CharT, Traits>& os, const local_time<Duration>& t); // C++ 20
952+
953+
// 21) sys_info
954+
template<class CharT, class Traits>
955+
basic_ostream<CharT, Traits>&
956+
operator<<(basic_ostream<CharT, Traits>& os, const sys_info& si);
957+
958+
// 22) local_info
959+
template<class CharT, class Traits>
960+
basic_ostream<charT, traits>&
961+
operator<<(basic_ostream<CharT, Traits>& os, const local_info& li);
962+
963+
// 23) zoned_time
964+
template<class CharT, class Traits, class Duration, class TimeZonePtr>
965+
basic_ostream<CharT, Traits>&
966+
operator<<(basic_ostream<CharT, Traits>& os, const zoned_time<Duration, TimeZonePtr>& zt);
943967
```
944968
945969
### Parameters
@@ -959,6 +983,9 @@ The `day` to output.
959983
*`hms`*\
960984
The `hh_mm_ss` to output.
961985
986+
*`li`*\
987+
The `local_info` to output.
988+
962989
*`m`*\
963990
The `month` to output.
964991
@@ -974,9 +1001,15 @@ The `month_weekday` to output.
9741001
*`mwdl`*\
9751002
The `month_weekday_last` to output.
9761003
1004+
*`si`*\
1005+
The `sys_info` to output.
1006+
9771007
*`t`*\
9781008
The `local_time`, `gps_time`, `tai_time`, or `utc_time` to output.
9791009
1010+
*`TimeZonePtr`*\
1011+
A pointer to the [time_zone](time-zone-class.md) stored in the [`zoned_time`](zoned-time-class.md).
1012+
9801013
*`wd`*\
9811014
The `weekday` to output.
9821015
@@ -1004,6 +1037,9 @@ The `year_month_weekday` to output.
10041037
*`ymwdl`*\
10051038
The `year_month_weekday_last` to output.
10061039
1040+
*`zt`*\
1041+
The `zoned_time` to output.
1042+
10071043
### Return value
10081044
10091045
The output stream you passed in, `os`
@@ -1050,6 +1086,12 @@ The output stream you passed in, `os`
10501086
10511087
20\) The `local_time` is output as the number of seconds since the clock's epoch. It's output as though by `os << std::chrono::sys_time<Duration>(some_local_time.time_since_epoch());`. For example, if `some_local_time` is August 18, 2021 3:13pm, the output is `1597792380`.
10521088
1089+
21\) In Microsoft's implementation, a `sys_info` is output as its `begin`, `end`, `offset`, `save`, and `abbrev` fields. For example: `begin: 2021-03-14 10:00:00, end: 2021-11-07 09:00:00, offset: -25200s, save: 60min, abbrev: PDT`
1090+
1091+
22\) In Microsoft's implementation, a `local_info` is output as yyyy-mm-dd hh:mm::ss.ssssss. For example, `2021-09-17 13:55:59.6590120`
1092+
1093+
23\) The local time in the `zoned_time` (obtained as `zt.get_local_time()`) is output using the format yyyy-mm-dd hh:mm:ss timezone. For example, `2021-09-15 10:45:00 GMT-6`
1094+
10531095
### Example: `operator<<`
10541096
10551097
```cpp

0 commit comments

Comments
 (0)