Date

The built-in type Date represents a calendar date as a year, month and day-of-month. Being a representation of a calendar date, Date does not uniquely define an Instant or even a range of Instant values on the global timeline. For example, the date 2020-01-01 can be seen as the range of instants from #2020-01-01T00:00Z# to #2020-01-01T23:59:59.999Z# if interpreted as a local date in the GMT time zone, but in the time zone Europe/Copenhagen it can be seen as the instants from #2019-12-31T23:00Z# to #2020-01-01T22:59:59.999Z#.

If you need to perform arithmetic on calendar dates together with time of day, use the zoned time and date functions.

Date::components : Date -> Date::Components

Returns the underlying representation of the given date. The returned data type has the following definition:

module YearMonth {
  type Components {
    year : Year,
    month : Month
  }
}

module Date {
  type Components : YearMonth::Components {
    day : Int
  }
}

Examples

val a = Date::components (Date::from 2020 12 21)
//    = Date::Components {
//      day = 21,
//      month = December,
//      year = Year::fromInt 2020
//    }

Date::fromComponents : Date::Components -> Date

Construct a Date from the underlying components. This function is partial and fails if the day component is invalid for the given year and month.

Examples

val a = Date::fromComponents Date::Components {
          day = 21,
          month = December,
          year = Year::fromInt 2020
        }
//   = Date::from 2020 12 21

Date::from : Int -> Int -> Int -> Date

A convenience wrapper around Date::fromComponents which takes the year, month and day as positional Int arguments.

Date::epochDay : Date -> Int

Returns the epoch day, defined as the number of calendar days since 1970-01-01 until the given date. The returned value may be negative if the given date is before the epoch.

This function is useful for obtaining the number of calendar days between two dates, as this equals the difference between their epoch days.

To obtain a Date from an epoch day, use Date::addPeriod.

Examples

val a = Date::epochDay (Date::from 2020 12 21)
//    = 18617

val b = Date::addPeriod (Period::from 0 0 18617) (Date::from 1970 1 1)
//    = Date::from 2020 12 21

Date::dayOfWeek : Date -> DayOfWeek

Returns the day of week for the given date.

Examples

val a = Date::dayOfWeek (Date::from 2020 12 21)
//    = Monday

Date::addPeriod : Period -> Date -> Date

Adds a calendar period to the given date.

A calendar period consists of a number of years, months and days. The period is added to the given date by first adding all the years, then all the months and finally all the days. Adding one year and adding 12 months is equivalent. If the day of month component would be invalid after all the months have been added, then it is adjusted back to the last valid day of month before the days of the period are added.

Examples

// Adding 1 month. Adding one month to 2020-03-31 gives the invalid date 2020-04-31 which is adjusted back to 2020-04-30.
val a = Date::addPeriod (Period::from 0 1 0) (Date::from 2020 3 31)
//    = Date::from 2020 4 30

// Adding 1 month and 1 day.
val b = Date::addPeriod (Period::from 0 1 1) (Date::from 2020 3 31)
//    = Date::from 2020 5 1