Skip to content
Topaz6.0 · Before release
Download

Search documentation

Specification 6.0 · Not released · Tested product 5.21.3

Use arrow keys to choose a result. Press Enter to open.

Type an API name, diagnostic number, rule, or project topic.

    Library · std.date

    Date.year

    Read the civil year from 1 through 9999.

    year() -> int
    Module
    std.date
    Receiver
    Date
    Minimum arity
    0
    Maximum arity
    0

    Declaration and parameters

    Link

    Availability

    Included by default: Pending

    Import std.date in language mode 5.21.

    The current compiler selects std/date.tpz for this language mode. Availability in other released editions and inclusion in each installed distribution are Pending.

    Source evidence

    Receiver

    Date

    Parameter constraints

    Date is an immutable proleptic Gregorian calendar date from 0001-01-01 through 9999-12-31. It contains no time of day, time zone, or locale. The same calendar rules apply before and after 1582.

    Date.fromYmd accepts years from 1 through 9999 and months from 1 through 12. The day must be a real day of the selected month and year. All range endpoints are included.

    A year divisible by 4 is a leap year except a century year that is not divisible by 400. February has 29 days in a leap year and 28 otherwise. April, June, September, and November have 30 days. The other months have 31.

    Valid components return Ok containing that date. Year zero, a year outside the supported range, an invalid month, and an invalid day return Err containing a descriptive nonempty string. Components are not normalized into another date.

    The error string describes the failed construction and has no stable machine readable format. Callers branch on Ok or Err.

    Date.year, Date.month, and Date.day are calls with no arguments. They return the validated components of the receiver. A valid Date makes these observations total and leaves the receiver unchanged.

    Arguments are evaluated once in source order before validation. An earlier fault prevents later evaluation. Constructors and observations do not read a host clock or perform external effects.

    Result

    The declared result type is int.

    Effects

    Failures

    Result and effects

    Link

    This call returns the receiver year and leaves the date unchanged.

    Resolved contracts

    Link

    Related entries

    Link

    std.date

    Construct valid Gregorian civil dates

    Link
    Ruletopaz.stdlib.contract.date-calendar.rule

    Construct valid Gregorian civil dates

    Date is an immutable proleptic Gregorian calendar date from 0001-01-01 through 9999-12-31. It contains no time of day, time zone, or locale. The same calendar rules apply before and after 1582.

    Date.fromYmd accepts years from 1 through 9999 and months from 1 through 12. The day must be a real day of the selected month and year. All range endpoints are included.

    A year divisible by 4 is a leap year except a century year that is not divisible by 400. February has 29 days in a leap year and 28 otherwise. April, June, September, and November have 30 days. The other months have 31.

    Valid components return Ok containing that date. Year zero, a year outside the supported range, an invalid month, and an invalid day return Err containing a descriptive nonempty string. Components are not normalized into another date.

    The error string describes the failed construction and has no stable machine readable format. Callers branch on Ok or Err.

    Date.year, Date.month, and Date.day are calls with no arguments. They return the validated components of the receiver. A valid Date makes these observations total and leaves the receiver unchanged.

    Arguments are evaluated once in source order before validation. An earlier fault prevents later evaluation. Constructors and observations do not read a host clock or perform external effects.

    Why

    Validating civil dates at construction gives every date observation a definite value. A shared Gregorian calendar and year range make dates independent of locale, time zones, and historical calendar cutovers.

    Source evidence

    Read leap day and both supported endpoints

    Link
    main.tpzRead leap day and both supported endpointsOpen in Playground
    1. import std.date { Date }
    2. import std.test
    3. import std.io
    4. let leap = test.assertOk(Date.fromYmd(2000, 2, 29))
    5. io.writeLine("{leap.year()} {leap.month()} {leap.day()}")
    6. io.writeLine(leap.toIso())
    7. io.writeLine(test.assertOk(Date.fromYmd(1, 1, 1)).toIso())
    8. io.writeLine(test.assertOk(Date.fromYmd(9999, 12, 31)).toIso())
    Expected outputexit 0
    2000 2 29
    2000-02-29
    0001-01-01
    9999-12-31
    
    $ topaz run main.tpz · target product 5.21.3
    Expected result

    Expected result

    Execution completes. Exit code 0.

    Expected stdout
    1. 2000 2 29
    2. 2000-02-29
    3. 0001-01-01
    4. 9999-12-31
    Source evidence

    Reject invalid years, months, and days without normalization

    Link
    main.tpzReject invalid years, months, and days without normalizationOpen in Playground
    1. import std.date { Date }
    2. import std.io
    3. function reject(year: int, month: int, day: int) -> () {
    4. match (Date.fromYmd(year, month, day)) {
    5. case Err(_) => io.writeLine("rejected")
    6. case Ok(_) => io.writeLine("accepted")
    7. }
    8. }
    9. reject(1900, 2, 29)
    10. reject(2023, 2, 29)
    11. reject(2024, 0, 1)
    12. reject(2024, 13, 1)
    13. reject(2024, 4, 31)
    14. reject(2024, 1, 0)
    15. reject(2024, 1, 32)
    16. reject(-1, 1, 1)
    17. reject(10000, 1, 1)
    18. reject(9223372036854775807, 1, 1)
    Expected outputexit 0
    rejected
    rejected
    rejected
    rejected
    rejected
    rejected
    rejected
    rejected
    rejected
    rejected
    
    $ topaz run main.tpz · target product 5.21.3
    Expected result

    Expected result

    Execution completes. Exit code 0.

    Expected stdout
    1. rejected
    2. rejected
    3. rejected
    4. rejected
    5. rejected
    6. rejected
    7. rejected
    8. rejected
    9. rejected
    10. rejected
    Source evidence

    Reject year zero during component construction

    Link
    main.tpzReject year zero during component constructionOpen in Playground
    1. import std.date { Date }
    2. import std.io
    3. match (Date.fromYmd(0, 1, 1)) {
    4. case Err(_) => io.writeLine("year zero rejected")
    5. case Ok(_) => io.writeLine("accepted")
    6. }
    Expected outputexit 0
    year zero rejected
    
    $ topaz run main.tpz · target product 5.21.3
    Expected result

    Expected result

    Execution completes. Exit code 0.

    Expected stdout
    1. year zero rejected
    Source evidence

    Evaluate all components before date validation

    Link
    main.tpzEvaluate all components before date validationOpen in Playground
    1. import std.date { Date }
    2. import std.io
    3. function observed(label: string, value: int) -> int {
    4. io.writeLine(label)
    5. return value
    6. }
    7. match (Date.fromYmd(observed("year", 2024), observed("month", 13), observed("day", 1))) {
    8. case Err(_) => io.writeLine("rejected")
    9. case Ok(_) => io.writeLine("accepted")
    10. }
    Expected outputexit 0
    year
    month
    day
    rejected
    
    $ topaz run main.tpz · target product 5.21.3
    Expected result

    Expected result

    Execution completes. Exit code 0.

    Expected stdout
    1. year
    2. month
    3. day
    4. rejected
    Source evidence

    Menu

    Download