Search results

There are no results.

std.time.Date

Value
type pub copy Date

A type representing a date in the Gregorian calendar, without a time and timezone.

Static methods

new

Show source code
Hide source code
fn pub inline static new(year: Int, month: Int, day: Int) -> Option[Date] {
  if
    year >= -2147483648
      and year <= 2147483647
      and month >= 1
      and month <= 12
      and day >= 1
      and day <= 31
  {
    Option.Some(new_unchecked(year, month, day))
  } else {
    Option.None
  }
}
fn pub inline static new(year: Int, month: Int, day: Int) -> Option[Date]

Returns a new Date, provided the given components are valid.

The arguments must be values in the following ranges:

  • year: -2147483648 up to and including 2147483647
  • month: 1 up to and including 12
  • day: 1 up to and including 31

If any of the arguments are out of bounds, an Option.None is returned.

Examples

import std.time (Date)

let date = Date
  .new(year: 2024, month: 12, day: 17)
  .or_panic('the Date is invalid')

date.year # => 2024

Instance methods

!=

Show source code
Hide source code
fn pub !=(other: T) -> Bool {
  (self == other).false?
}
fn pub !=(other: T) -> Bool

Returns true if self and the given object are not equal to each other.

==

Show source code
Hide source code
fn pub ==(other: Date) -> Bool {
  @bits == other.bits
}
fn pub ==(other: Date) -> Bool

Returns true if self and the given object are equal to each other.

This operator is used to perform structural equality. This means two objects residing in different memory locations may be considered equal, provided their structure is equal. For example, two different arrays may be considered to have structural equality if they contain the exact same values.

day

Show source code
Hide source code
fn pub inline day -> Int {
  @bits & 0x1F
}
fn pub inline day -> Int

Returns the day in the range 1 to 31.

day_of_week

Show source code
Hide source code
fn pub day_of_week -> Int {
  # January 1st, 1970 (our anchor date) was on a Thursday. We add 3 so that
  # Monday (3 days before Thursday) becomes the anchor date.
  #
  # We later on add 1 since the % operator will return 0 for Monday (since its
  # the first value in the range), but week days range from 1 to 7; not 0 to
  # 6.
  #
  # The following table should help illustrate this:
  #
  # | Date       | Day of week | days_since_unix_epoch
  # |:-----------|:------------|:----------------------
  # | 1969-12-29 | Monday      | -3
  # | 1969-12-30 | Tuesday     | -2
  # | 1969-12-31 | Wednesday   | -1
  # | 1970-01-01 | Thursday    | 0
  # | 1970-01-02 | Friday      | 1
  # | 1970-01-03 | Saturday    | 2
  # | 1970-01-04 | Sunday      | 3
  #
  # For these dates, the calculations would be as follows:
  #
  # | Date       | Calculation        | Simplified  | Return value
  # |:-----------|:-------------------|:------------|:------------
  # | 1969-12-29 | ((-3 + 3) % 7) + 1 | (0 % 7) + 1 | 1
  # | 1969-12-30 | ((-2 + 3) % 7) + 1 | (1 % 7) + 1 | 2
  # | 1969-12-31 | ((-1 + 3) % 7) + 1 | (2 % 7) + 1 | 3
  # | 1970-01-01 | ((0 + 3) % 7) + 1  | (3 % 7) + 1 | 4
  # | 1970-01-02 | ((1 + 3) % 7) + 1  | (4 % 7) + 1 | 5
  # | 1970-01-03 | ((2 + 3) % 7) + 1  | (5 % 7) + 1 | 6
  # | 1970-01-04 | ((3 + 3) % 7) + 1  | (6 % 7) + 1 | 7
  days_since_unix_epoch + 3 % DAYS_PER_WEEK + 1
}
fn pub day_of_week -> Int

Returns the day of the week from 1 to 7.

Per ISO 8601 the first day of the week starts on Monday, not Sunday.

day_of_year

Show source code
Hide source code
fn pub day_of_year -> Int {
  let days = if leap_year? { LEAP_DAYS } else { NORMAL_DAYS }

  days.get(month - 1) + day
}
fn pub day_of_year -> Int

Returns the day of the year from 1 to 366 for leap years, and from 1 to 365 for regular years.

days_since_unix_epoch

Show source code
Hide source code
fn pub days_since_unix_epoch -> Int {
  let year = if month <= 2 { year - 1 } else { year }
  let month = month
  let era = if year >= 0 { year } else { year - 399 } / 400
  let yoe = year - (era * 400)
  let doy = (((153 * if month > 2 { month - 3 } else { month + 9 }) + 2) / 5)
    + day
    - 1
  let doe = (yoe * 365) + (yoe / 4) - (yoe / 100) + doy

  (era * 146_097) + doe - 719_468
}
fn pub days_since_unix_epoch -> Int

Returns the number of days between self and the Unix epoch.

The returned Int is negative if self is before the Unix epoch, and positive for a value that is on or after the Unix epoch.

fmt

Show source code
Hide source code
fn pub fmt(formatter: mut Formatter) {
  let year = year.to_string.pad_start(with: '0', chars: 4)
  let month = month.to_string.pad_start(with: '0', chars: 2)
  let day = day.to_string.pad_start(with: '0', chars: 2)

  formatter.write('${year}-${month}-${day}')
}
fn pub fmt(formatter: mut Formatter)

Formats self in a human-readable format for debugging purposes.

leap_year?

Show source code
Hide source code
fn pub leap_year? -> Bool {
  let year = year

  (year % 4) == 0 and ((year % 100) > 0 or (year % 400) == 0)
}
fn pub leap_year? -> Bool

Returns true if the current year is a leap year.

month

Show source code
Hide source code
fn pub inline month -> Int {
  @bits >> 5 & 0xF
}
fn pub inline month -> Int

Returns the month in the range 1 to 12.

year

Show source code
Hide source code
fn pub inline year -> Int {
  @bits >> 9
}
fn pub inline year -> Int

Returns the year.

Implemented traits

std.cmp.

Equal

impl Equal[Date] for Date
std.fmt.

Format

impl Format for Date