# 27 Time library [time]

## 27.8 The civil calendar [time.cal]

### 27.8.14 Class year_­month_­day[time.cal.ymd]

#### 27.8.14.3 Non-member functions [time.cal.ymd.nonmembers]

```constexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept; ```
Returns: x.year() == y.year() && x.month() == y.month() && x.day() == y.day().
```constexpr strong_ordering operator<=>(const year_month_day& x, const year_month_day& y) noexcept; ```
Effects: Equivalent to: if (auto c = x.year() <=> y.year(); c != 0) return c; if (auto c = x.month() <=> y.month(); c != 0) return c; return x.day() <=> y.day();
```constexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept; ```
Constraints: If the argument supplied by the caller for the months parameter is convertible to years, its implicit conversion sequence to years is worse than its implicit conversion sequence to months ([over.ics.rank]).
Returns: (ymd.year() / ymd.month() + dm) / ymd.day().
[Note 1:
If ymd.day() is in the range [1d, 28d], ok() will return true for the resultant year_­month_­day.
â€” end note]
```constexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept; ```
Constraints: If the argument supplied by the caller for the months parameter is convertible to years, its implicit conversion sequence to years is worse than its implicit conversion sequence to months ([over.ics.rank]).
Returns: ymd + dm.
```constexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept; ```
Constraints: If the argument supplied by the caller for the months parameter is convertible to years, its implicit conversion sequence to years is worse than its implicit conversion sequence to months ([over.ics.rank]).
Returns: ymd + (-dm).
```constexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept; ```
Returns: (ymd.year() + dy) / ymd.month() / ymd.day().
[Note 2:
If ymd.month() is February and ymd.day() is not in the range [1d, 28d], ok() can return false for the resultant year_­month_­day.
â€” end note]
```constexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept; ```
Returns: ymd + dy.
```constexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept; ```
Returns: ymd + (-dy).
```template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const year_month_day& ymd); ```
Effects: Equivalent to: return os << (ymd.ok() ? format(STATICALLY-WIDEN<charT>("{:%F}"), ymd) : format(STATICALLY-WIDEN<charT>("{:%F} is not a valid date"), 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); ```
Effects: Attempts to parse the input stream is into the year_­month_­day ymd using the format flags given in the NTCTS fmt as specified in [time.parse].
If the parse fails to decode a valid year_­month_­day, is.setstate(ios_­base​::​failbit) is called and ymd is not modified.
If %Z is used and successfully parsed, that value will be assigned to *abbrev if abbrev is non-null.
If %z (or a modified variant) is used and successfully parsed, that value will be assigned to *offset if offset is non-null.
Returns: is.