# 27 Time library [time]

## 27.8 The civil calendar [time.cal]

### 27.8.13 Class year_­month[time.cal.ym]

#### 27.8.13.3 Non-member functions [time.cal.ym.nonmembers]

```constexpr bool operator==(const year_month& x, const year_month& y) noexcept; ```
Returns: x.year() == y.year() && x.month() == y.month().
```constexpr strong_ordering operator<=>(const year_month& x, const year_month& y) noexcept; ```
Effects: Equivalent to: if (auto c = x.year() <=> y.year(); c != 0) return c; return x.month() <=> y.month();
```constexpr year_month operator+(const year_month& ym, 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: A year_­month value z such that z.ok() && z - ym == dm is true.
Complexity: with respect to the value of dm.
```constexpr year_month operator+(const months& dm, const year_month& ym) 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: ym + dm.
```constexpr year_month operator-(const year_month& ym, 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: ym + -dm.
```constexpr months operator-(const year_month& x, const year_month& y) noexcept; ```
Returns: x.year() - y.year() + months{static_cast<int>(unsigned{x.month()}) - static_cast<int>(unsigned{y.month()})}
```constexpr year_month operator+(const year_month& ym, const years& dy) noexcept; ```
Returns: (ym.year() + dy) / ym.month().
```constexpr year_month operator+(const years& dy, const year_month& ym) noexcept; ```
Returns: ym + dy.
```constexpr year_month operator-(const year_month& ym, const years& dy) noexcept; ```
Returns: ym + -dy.
```template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const year_month& ym); ```
Effects: Equivalent to: return os << format(os.getloc(), STATICALLY-WIDEN<charT>("{}/{}"), ym.year(), ym.month());
```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); ```
Effects: Attempts to parse the input stream is into the year_­month ym using the format flags given in the NTCTS fmt as specified in [time.parse].
If the parse fails to decode a valid year_­month, is.setstate(ios_­base​::​failbit) is called and ym 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.