Struct icu_calendar::Date

source ·
pub struct Date<A: AsCalendar> { /* private fields */ }
Expand description

A date for a given calendar.

This can work with wrappers around Calendar types, e.g. Rc<C>, via the AsCalendar trait.

This can be constructed constructed from its fields via Self::try_new_from_codes(), or can be constructed with one of the new_<calendar>_datetime() per-calendar methods (and then freely converted between calendars).

use icu::calendar::Date;

// Example: creation of ISO date from integers.
let date_iso = Date::try_new_iso_date(1970, 1, 2)
    .expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.year().number, 1970);
assert_eq!(date_iso.month().ordinal, 1);
assert_eq!(date_iso.day_of_month().0, 2);

Implementations§

source§

impl<A: AsCalendar> Date<A>

source

pub fn try_new_from_codes( era: Era, year: i32, month_code: MonthCode, day: u8, calendar: A ) -> Result<Self, CalendarError>

Construct a date from from era/month codes and fields, and some calendar representation

source

pub fn new_from_iso(iso: Date<Iso>, calendar: A) -> Self

Construct a date from an ISO date and some calendar representation

source

pub fn to_iso(&self) -> Date<Iso>

Convert the Date to an ISO Date

source

pub fn to_calendar<A2: AsCalendar>(&self, calendar: A2) -> Date<A2>

Convert the Date to a date in a different calendar

source

pub fn months_in_year(&self) -> u8

The number of months in the year of this date

source

pub fn days_in_year(&self) -> u32

The number of days in the year of this date

source

pub fn days_in_month(&self) -> u8

The number of days in the month of this date

source

pub fn day_of_week(&self) -> IsoWeekday

The day of the week for this date

Monday is 1, Sunday is 7, according to ISO

source

pub fn year(&self) -> FormattableYear

The calendar-specific year represented by self

source

pub fn month(&self) -> FormattableMonth

The calendar-specific month represented by self

source

pub fn day_of_month(&self) -> DayOfMonth

The calendar-specific day-of-month represented by self

source

pub fn day_of_year_info(&self) -> DayOfYearInfo

The calendar-specific day-of-month represented by self

source

pub fn week_of_month(&self, first_weekday: IsoWeekday) -> WeekOfMonth

The week of the month containing this date.

Examples
use icu::calendar::types::IsoWeekday;
use icu::calendar::types::WeekOfMonth;
use icu::calendar::Date;

let date = Date::try_new_iso_date(2022, 8, 10).unwrap(); // second Wednesday

// The following info is usually locale-specific
let first_weekday = IsoWeekday::Sunday;

assert_eq!(date.week_of_month(first_weekday), WeekOfMonth(2));
source

pub fn week_of_year( &self, config: &WeekCalculator ) -> Result<WeekOf, CalendarError>

The week of the year containing this date.

Examples
use icu::calendar::types::IsoWeekday;
use icu::calendar::week::RelativeUnit;
use icu::calendar::week::WeekCalculator;
use icu::calendar::week::WeekOf;
use icu::calendar::Date;

let date = Date::try_new_iso_date(2022, 8, 26).unwrap();

// The following info is usually locale-specific
let week_calculator = WeekCalculator::default();

assert_eq!(
    date.week_of_year(&week_calculator),
    Ok(WeekOf {
        week: 35,
        unit: RelativeUnit::Current
    })
);
source

pub fn from_raw( inner: <A::Calendar as Calendar>::DateInner, calendar: A ) -> Self

Construct a date from raw values for a given calendar. This does not check any invariants for the date and calendar, and should only be called by calendar implementations.

Calling this outside of calendar implementations is sound, but calendar implementations are not expected to do anything sensible with such invalid dates.

AnyCalendar will panic if AnyCalendar Date objects with mismatching date and calendar types are constructed

source

pub fn inner(&self) -> &<A::Calendar as Calendar>::DateInner

Get the inner date implementation. Should not be called outside of calendar implementations

source

pub fn calendar(&self) -> &A::Calendar

Get a reference to the contained calendar

source

pub fn calendar_wrapper(&self) -> &A

Get a reference to the contained calendar wrapper

(Useful in case the user wishes to e.g. clone an Rc)

source§

impl<C: IntoAnyCalendar, A: AsCalendar<Calendar = C>> Date<A>

source

pub fn to_any(&self) -> Date<AnyCalendar>

Type-erase the date, converting it to a date for AnyCalendar

source§

impl<C: Calendar> Date<C>

source

pub fn wrap_calendar_in_rc(self) -> Date<Rc<C>>

Wrap the calendar type in Rc<T>

Useful when paired with Self::to_any() to obtain a Date<Rc<AnyCalendar>>

source

pub fn wrap_calendar_in_arc(self) -> Date<Arc<C>>

Wrap the calendar type in Arc<T>

Useful when paired with Self::to_any() to obtain a Date<Rc<AnyCalendar>>

source§

impl Date<Buddhist>

source

pub fn try_new_buddhist_date( year: i32, month: u8, day: u8 ) -> Result<Date<Buddhist>, CalendarError>

Construct a new Buddhist Date.

Years are specified as BE years.

use icu::calendar::Date;
use std::convert::TryFrom;

let date_buddhist = Date::try_new_buddhist_date(1970, 1, 2)
    .expect("Failed to initialize Buddhist Date instance.");

assert_eq!(date_buddhist.year().number, 1970);
assert_eq!(date_buddhist.month().ordinal, 1);
assert_eq!(date_buddhist.day_of_month().0, 2);
source§

impl Date<Coptic>

source

pub fn try_new_coptic_date( year: i32, month: u8, day: u8 ) -> Result<Date<Coptic>, CalendarError>

Construct new Coptic Date.

Negative years are in the B.D. era, starting with 0 = 1 B.D.

use icu::calendar::Date;

let date_coptic = Date::try_new_coptic_date(1686, 5, 6)
    .expect("Failed to initialize Coptic Date instance.");

assert_eq!(date_coptic.year().number, 1686);
assert_eq!(date_coptic.month().ordinal, 5);
assert_eq!(date_coptic.day_of_month().0, 6);
source§

impl Date<Ethiopian>

source

pub fn try_new_ethiopian_date( era_style: EthiopianEraStyle, year: i32, month: u8, day: u8 ) -> Result<Date<Ethiopian>, CalendarError>

Construct new Ethiopian Date.

For the Amete Mihret era style, negative years work with year 0 as 1 pre-Incarnation, year -1 as 2 pre-Incarnation, and so on.

use icu::calendar::ethiopian::EthiopianEraStyle;
use icu::calendar::Date;

let date_ethiopian = Date::try_new_ethiopian_date(
    EthiopianEraStyle::AmeteMihret,
    2014,
    8,
    25,
)
.expect("Failed to initialize Ethopic Date instance.");

assert_eq!(date_ethiopian.year().number, 2014);
assert_eq!(date_ethiopian.month().ordinal, 8);
assert_eq!(date_ethiopian.day_of_month().0, 25);
source§

impl Date<Gregorian>

source

pub fn try_new_gregorian_date( year: i32, month: u8, day: u8 ) -> Result<Date<Gregorian>, CalendarError>

Construct a new Gregorian Date.

Years are specified as ISO years.

use icu::calendar::Date;
use std::convert::TryFrom;

// Conversion from ISO to Gregorian
let date_gregorian = Date::try_new_gregorian_date(1970, 1, 2)
    .expect("Failed to initialize Gregorian Date instance.");

assert_eq!(date_gregorian.year().number, 1970);
assert_eq!(date_gregorian.month().ordinal, 1);
assert_eq!(date_gregorian.day_of_month().0, 2);
source§

impl Date<Indian>

source

pub fn try_new_indian_date( year: i32, month: u8, day: u8 ) -> Result<Date<Indian>, CalendarError>

Construct new Indian Date, with year provided in the Śaka era.

use icu::calendar::Date;

let date_indian = Date::try_new_indian_date(1891, 10, 12)
    .expect("Failed to initialize Indian Date instance.");

assert_eq!(date_indian.year().number, 1891);
assert_eq!(date_indian.month().ordinal, 10);
assert_eq!(date_indian.day_of_month().0, 12);
source§

impl Date<Iso>

source

pub fn try_new_iso_date( year: i32, month: u8, day: u8 ) -> Result<Date<Iso>, CalendarError>

Construct a new ISO date from integers.

use icu::calendar::Date;

let date_iso = Date::try_new_iso_date(1970, 1, 2)
    .expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.year().number, 1970);
assert_eq!(date_iso.month().ordinal, 1);
assert_eq!(date_iso.day_of_month().0, 2);
source§

impl Date<Japanese>

source

pub fn try_new_japanese_date<A: AsCalendar<Calendar = Japanese>>( era: Era, year: i32, month: u8, day: u8, japanese_calendar: A ) -> Result<Date<A>, CalendarError>

Construct a new Japanese Date.

Years are specified in the era provided, and must be in range for Japanese eras (e.g. dates past April 30 Heisei 31 must be in Reiwa; “Jun 5 Heisei 31” and “Jan 1 Heisei 32” will not be adjusted to being in Reiwa 1 and 2 respectively)

However, dates may always be specified in “bce” or “ce” and they will be adjusted as necessary.

use icu::calendar::japanese::Japanese;
use icu::calendar::{types, Date, Ref};
use std::convert::TryFrom;
use tinystr::tinystr;

let japanese_calendar =
    Japanese::try_new_unstable(&icu_testdata::unstable())
        .expect("Cannot load japanese data");
// for easy sharing
let japanese_calendar = Ref(&japanese_calendar);

let era = types::Era(tinystr!(16, "heisei"));

let date = Date::try_new_japanese_date(era, 14, 1, 2, japanese_calendar)
    .expect("Constructing a date should succeed");

assert_eq!(date.year().era, era);
assert_eq!(date.year().number, 14);
assert_eq!(date.month().ordinal, 1);
assert_eq!(date.day_of_month().0, 2);

// This function will error for eras that are out of bounds:
// (Heisei was 32 years long, Heisei 33 is in Reiwa)
let oob_date =
    Date::try_new_japanese_date(era, 33, 1, 2, japanese_calendar);
assert!(oob_date.is_err());

// and for unknown eras
let fake_era = types::Era(tinystr!(16, "neko")); // 🐱
let fake_date =
    Date::try_new_japanese_date(fake_era, 10, 1, 2, japanese_calendar);
assert!(fake_date.is_err());
source§

impl Date<JapaneseExtended>

source

pub fn try_new_japanese_extended_date<A: AsCalendar<Calendar = JapaneseExtended>>( era: Era, year: i32, month: u8, day: u8, japanext_calendar: A ) -> Result<Date<A>, CalendarError>

Construct a new Japanese Date with all eras.

Years are specified in the era provided, and must be in range for Japanese eras (e.g. dates past April 30 Heisei 31 must be in Reiwa; “Jun 5 Heisei 31” and “Jan 1 Heisei 32” will not be adjusted to being in Reiwa 1 and 2 respectively)

However, dates may always be specified in “bce” or “ce” and they will be adjusted as necessary.

use icu::calendar::japanese::JapaneseExtended;
use icu::calendar::{types, Date, Ref};
use std::convert::TryFrom;
use tinystr::tinystr;

let japanext_calendar =
    JapaneseExtended::try_new_unstable(&icu_testdata::unstable())
        .expect("Cannot load japanese data");
// for easy sharing
let japanext_calendar = Ref(&japanext_calendar);

let era = types::Era(tinystr!(16, "kansei-1789"));

let date =
    Date::try_new_japanese_extended_date(era, 7, 1, 2, japanext_calendar)
        .expect("Constructing a date should succeed");

assert_eq!(date.year().era, era);
assert_eq!(date.year().number, 7);
assert_eq!(date.month().ordinal, 1);
assert_eq!(date.day_of_month().0, 2);
source§

impl Date<Julian>

source

pub fn try_new_julian_date( year: i32, month: u8, day: u8 ) -> Result<Date<Julian>, CalendarError>

Construct new Julian Date.

Zero and negative years are in BC, with year 0 = 1 BC

use icu::calendar::Date;

let date_julian = Date::try_new_julian_date(1969, 12, 20)
    .expect("Failed to initialize Julian Date instance.");

assert_eq!(date_julian.year().number, 1969);
assert_eq!(date_julian.month().ordinal, 12);
assert_eq!(date_julian.day_of_month().0, 20);

Trait Implementations§

source§

impl<A: AsCalendar + Clone> Clone for Date<A>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<A: AsCalendar> Debug for Date<A>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<C, A, B> PartialEq<Date<B>> for Date<A>where C: Calendar, A: AsCalendar<Calendar = C>, B: AsCalendar<Calendar = C>,

source§

fn eq(&self, other: &Date<B>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A> Copy for Date<A>where A: AsCalendar + Copy, <<A as AsCalendar>::Calendar as Calendar>::DateInner: Copy,

source§

impl<A: AsCalendar> Eq for Date<A>

Auto Trait Implementations§

§

impl<A> RefUnwindSafe for Date<A>where A: RefUnwindSafe, <<A as AsCalendar>::Calendar as Calendar>::DateInner: RefUnwindSafe,

§

impl<A> Send for Date<A>where A: Send, <<A as AsCalendar>::Calendar as Calendar>::DateInner: Send,

§

impl<A> Sync for Date<A>where A: Sync, <<A as AsCalendar>::Calendar as Calendar>::DateInner: Sync,

§

impl<A> Unpin for Date<A>where A: Unpin, <<A as AsCalendar>::Calendar as Calendar>::DateInner: Unpin,

§

impl<A> UnwindSafe for Date<A>where A: UnwindSafe, <<A as AsCalendar>::Calendar as Calendar>::DateInner: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> ErasedDestructor for Twhere T: 'static,

source§

impl<T> MaybeSendSync for T