`Period`

The following functions operate on the built-in type `Period`

representing calendar periods.

A `Period`

represents an amount of time in terms of years, months and days.
See Duration for another representation of time amounts based on absolute time.

`components : Period -> Period::Components`

Returns the underlying representation of the `Period`

.
The returned data type has the following definition:

```
module Period {
type Components {
years : Int,
months : Int,
days : Int
}
}
```

### Examples

```
val a = Period::components (Period::from 1 2 3)
// = Period::Components { days = 3, months = 2, years = 1 }
```

`fromComponents : Period::Components -> Period`

Constructs a `Period`

from its components.

### Examples

```
val a = Period::fromComponents Period::Components { days = 3, months = 2, years = 1 }
// = Period::from 3 2 1
```

`from : Int -> Int -> Int -> Period`

Convenience wrapper for Period::fromComponents which receives the components as positional arguments.

The order of arguments is

years

months

days

`between : Date -> Date -> Period`

Returns a `Period`

consisting of the number of years, months, and days between two dates.

The start date is included, but the end date is not. The period is calculated by removing complete months, then calculating the remaining number of days, adjusting to ensure that both have the same sign. The number of months is then split into years and months based on a 12 month year. A month is considered if the end day-of-month is greater than or equal to the start day-of-month. For example, from 2010-01-15 to 2011-03-18 is one year, two months and three days.

The result of this method can be a negative period if the end is before the start. The negative sign will be the same in each of year, month and day.

### Examples

```
val a = Period::between (Date::from 2020 January 1) (Date::from 2021 January 1)
// = Period::from 1 0 0
val b = Period::between (Date::from 2020 May 30) (Date::from 1999 December 24)
// = Period::from (-20) (-5) (-6)
// All components in the result have the same sign.
// Thus the following results in a period of 24 days rather than
// a period of 1 month and -5 days.
val c = Period::between (Date::from 2020 February 15) (Date::from 2020 March 10)
// = Period::from 0 0 24
```

`add : Period -> Period -> Period`

Adds two periods.

This operates separately on the years, months and days. No normalization is performed.

For example, “1 year, 6 months and 3 days” plus “2 years, 6 months and 2 days” returns “3 years, 12 months and 5 days”.

### Examples

```
val a = Period::add (Period::from 1 6 3) (Period::from 2 6 2)
// = Period::from 3 12 5
```

`negated : Period -> Period`

Negates the `Period`

.
Each of the years, months and days components in the period are negated.

### Examples

```
val a = Period::negated (Period::from 1 6 3)
// = Period::from (-1) (-6) (-3)
```