6 releases (1 stable)

1.0.0 Sep 27, 2022
1.0.0-beta1 Aug 5, 2022
0.6.0 May 10, 2022
0.5.0 Jan 31, 2022
0.0.1 Apr 29, 2021

#19 in Internationalization (i18n)

Download history 1902/week @ 2022-08-18 1185/week @ 2022-08-25 2587/week @ 2022-09-01 2529/week @ 2022-09-08 2496/week @ 2022-09-15 2895/week @ 2022-09-22 2032/week @ 2022-09-29 2181/week @ 2022-10-06 1968/week @ 2022-10-13 2973/week @ 2022-10-20 2448/week @ 2022-10-27 2352/week @ 2022-11-03 2233/week @ 2022-11-10 1864/week @ 2022-11-17 1452/week @ 2022-11-24 1411/week @ 2022-12-01

7,412 downloads per month
Used in 14 crates (8 directly)

Unicode-DFS-2016

2MB
21K SLoC

icu_calendar crates.io

Types for dealing with dates, times, and custom calendars.

This module is published as its own crate (icu_calendar) and as part of the icu crate. See the latter for more details on the ICU4X project. The [types] module has a lot of common types for dealing with dates and times.

[Calendar] is a trait that allows one to define custom calendars, and [Date] can represent dates for arbitrary calendars.

The [iso] and [gregorian] modules contain implementations for the ISO and Gregorian calendars respectively. Further calendars can be found in modules like [japanese], [julian], [coptic], [indian], [buddhist], and [ethiopian].

Most interaction with this crate will be done via the [Date] and [DateTime] types.

Some of the algorithms implemented here are based on Dershowitz, Nachum, and Edward M. Reingold. Calendrical calculations. Cambridge University Press, 2008. with associated Lisp code found at https://github.com/EdReingold/calendar-code2.

Examples

Examples of date manipulation using Date object. Date objects are useful for working with dates, encompassing information about the day, month, year, as well as the calendar type.

use icu::calendar::{types::IsoWeekday, Date};

// Creating ISO date: 1992-09-02.
let mut date_iso = Date::try_new_iso_date(1992, 9, 2)
    .expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.day_of_week(), IsoWeekday::Wednesday);
assert_eq!(date_iso.year().number, 1992);
assert_eq!(date_iso.month().ordinal, 9);
assert_eq!(date_iso.day_of_month().0, 2);

// Answering questions about days in month and year.
assert_eq!(date_iso.days_in_year(), 366);
assert_eq!(date_iso.days_in_month(), 30);

Example of converting an ISO date across Indian and Buddhist calendars.

use icu::calendar::{buddhist::Buddhist, indian::Indian, Date};

// Creating ISO date: 1992-09-02.
let mut date_iso = Date::try_new_iso_date(1992, 9, 2)
    .expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.year().number, 1992);
assert_eq!(date_iso.month().ordinal, 9);
assert_eq!(date_iso.day_of_month().0, 2);

// Conversion into Indian calendar: 1914-08-02.
let date_indian = date_iso.to_calendar(Indian);
assert_eq!(date_indian.year().number, 1914);
assert_eq!(date_indian.month().ordinal, 6);
assert_eq!(date_indian.day_of_month().0, 11);

// Conversion into Buddhist calendar: 2535-09-02.
let date_buddhist = date_iso.to_calendar(Buddhist);
assert_eq!(date_buddhist.year().number, 2535);
assert_eq!(date_buddhist.month().ordinal, 9);
assert_eq!(date_buddhist.day_of_month().0, 2);

Example using DateTime object. Similar to Date objects, DateTime objects contain an accessible Date object containing information about the day, month, year, and calendar type. Additionally, DateTime objects contain an accessible Time object, including granularity of hour, minute, second, and nanosecond.

use icu::calendar::{types::IsoWeekday, types::Time, DateTime};

// Creating ISO date: 1992-09-02 8:59
let mut datetime_iso = DateTime::try_new_iso_datetime(1992, 9, 2, 8, 59, 0)
    .expect("Failed to initialize ISO DateTime instance.");

assert_eq!(datetime_iso.date.day_of_week(), IsoWeekday::Wednesday);
assert_eq!(datetime_iso.date.year().number, 1992);
assert_eq!(datetime_iso.date.month().ordinal, 9);
assert_eq!(datetime_iso.date.day_of_month().0, 2);
assert_eq!(datetime_iso.time.hour.number(), 8);
assert_eq!(datetime_iso.time.minute.number(), 59);
assert_eq!(datetime_iso.time.second.number(), 0);
assert_eq!(datetime_iso.time.nanosecond.number(), 0);

More Information

For more information on development, authorship, contributing etc. please visit ICU4X home page.

Dependencies