pub struct TimeDate { /* private fields */ }
Expand description

Date in the proleptic Gregorian calendar.

By default, years between ±9999 inclusive are representable. This can be expanded to ±999,999 inclusive by enabling the large-dates crate feature. Doing so has performance implications and introduces some ambiguities when parsing.

Implementations

The minimum valid Date.

The value of this may vary depending on the feature flags enabled.

The maximum valid Date.

The value of this may vary depending on the feature flags enabled.

Attempt to create a Date from the year, month, and day.

assert!(Date::from_calendar_date(2019, Month::January, 1).is_ok());
assert!(Date::from_calendar_date(2019, Month::December, 31).is_ok());
assert!(Date::from_calendar_date(2019, Month::February, 29).is_err()); // 2019 isn't a leap year.

Attempt to create a Date from the year and ordinal day number.

assert!(Date::from_ordinal_date(2019, 1).is_ok());
assert!(Date::from_ordinal_date(2019, 365).is_ok());
assert!(Date::from_ordinal_date(2019, 366).is_err()); // 2019 isn't a leap year.

Attempt to create a Date from the ISO year, week, and weekday.

assert!(Date::from_iso_week_date(2019, 1, Monday).is_ok());
assert!(Date::from_iso_week_date(2019, 1, Tuesday).is_ok());
assert!(Date::from_iso_week_date(2020, 53, Friday).is_ok());
assert!(Date::from_iso_week_date(2019, 53, Monday).is_err()); // 2019 doesn't have 53 weeks.

Create a Date from the Julian day.

The algorithm to perform this conversion is derived from one provided by Peter Baum; it is freely available here.

assert_eq!(Date::from_julian_day(0), Ok(date!(-4713 - 11 - 24)));
assert_eq!(Date::from_julian_day(2_451_545), Ok(date!(2000 - 01 - 01)));
assert_eq!(Date::from_julian_day(2_458_485), Ok(date!(2019 - 01 - 01)));
assert_eq!(Date::from_julian_day(2_458_849), Ok(date!(2019 - 12 - 31)));

Get the year of the date.

assert_eq!(date!(2019 - 01 - 01).year(), 2019);
assert_eq!(date!(2019 - 12 - 31).year(), 2019);
assert_eq!(date!(2020 - 01 - 01).year(), 2020);

Get the month.

assert_eq!(date!(2019 - 01 - 01).month(), Month::January);
assert_eq!(date!(2019 - 12 - 31).month(), Month::December);

Get the day of the month.

The returned value will always be in the range 1..=31.

assert_eq!(date!(2019 - 01 - 01).day(), 1);
assert_eq!(date!(2019 - 12 - 31).day(), 31);

Get the day of the year.

The returned value will always be in the range 1..=366 (1..=365 for common years).

assert_eq!(date!(2019 - 01 - 01).ordinal(), 1);
assert_eq!(date!(2019 - 12 - 31).ordinal(), 365);

Get the ISO week number.

The returned value will always be in the range 1..=53.

assert_eq!(date!(2019 - 01 - 01).iso_week(), 1);
assert_eq!(date!(2019 - 10 - 04).iso_week(), 40);
assert_eq!(date!(2020 - 01 - 01).iso_week(), 1);
assert_eq!(date!(2020 - 12 - 31).iso_week(), 53);
assert_eq!(date!(2021 - 01 - 01).iso_week(), 53);

Get the week number where week 1 begins on the first Sunday.

The returned value will always be in the range 0..=53.

assert_eq!(date!(2019 - 01 - 01).sunday_based_week(), 0);
assert_eq!(date!(2020 - 01 - 01).sunday_based_week(), 0);
assert_eq!(date!(2020 - 12 - 31).sunday_based_week(), 52);
assert_eq!(date!(2021 - 01 - 01).sunday_based_week(), 0);

Get the week number where week 1 begins on the first Monday.

The returned value will always be in the range 0..=53.

assert_eq!(date!(2019 - 01 - 01).monday_based_week(), 0);
assert_eq!(date!(2020 - 01 - 01).monday_based_week(), 0);
assert_eq!(date!(2020 - 12 - 31).monday_based_week(), 52);
assert_eq!(date!(2021 - 01 - 01).monday_based_week(), 0);

Get the year, month, and day.

assert_eq!(
    date!(2019 - 01 - 01).to_calendar_date(),
    (2019, Month::January, 1)
);

Get the year and ordinal day number.

assert_eq!(date!(2019 - 01 - 01).to_ordinal_date(), (2019, 1));

Get the ISO 8601 year, week number, and weekday.

assert_eq!(date!(2019 - 01 - 01).to_iso_week_date(), (2019, 1, Tuesday));
assert_eq!(date!(2019 - 10 - 04).to_iso_week_date(), (2019, 40, Friday));
assert_eq!(
    date!(2020 - 01 - 01).to_iso_week_date(),
    (2020, 1, Wednesday)
);
assert_eq!(
    date!(2020 - 12 - 31).to_iso_week_date(),
    (2020, 53, Thursday)
);
assert_eq!(date!(2021 - 01 - 01).to_iso_week_date(), (2020, 53, Friday));

Get the weekday.

assert_eq!(date!(2019 - 01 - 01).weekday(), Tuesday);
assert_eq!(date!(2019 - 02 - 01).weekday(), Friday);
assert_eq!(date!(2019 - 03 - 01).weekday(), Friday);
assert_eq!(date!(2019 - 04 - 01).weekday(), Monday);
assert_eq!(date!(2019 - 05 - 01).weekday(), Wednesday);
assert_eq!(date!(2019 - 06 - 01).weekday(), Saturday);
assert_eq!(date!(2019 - 07 - 01).weekday(), Monday);
assert_eq!(date!(2019 - 08 - 01).weekday(), Thursday);
assert_eq!(date!(2019 - 09 - 01).weekday(), Sunday);
assert_eq!(date!(2019 - 10 - 01).weekday(), Tuesday);
assert_eq!(date!(2019 - 11 - 01).weekday(), Friday);
assert_eq!(date!(2019 - 12 - 01).weekday(), Sunday);

Get the next calendar date.

assert_eq!(
    date!(2019 - 01 - 01).next_day(),
    Some(date!(2019 - 01 - 02))
);
assert_eq!(
    date!(2019 - 01 - 31).next_day(),
    Some(date!(2019 - 02 - 01))
);
assert_eq!(
    date!(2019 - 12 - 31).next_day(),
    Some(date!(2020 - 01 - 01))
);
assert_eq!(Date::MAX.next_day(), None);

Get the previous calendar date.

assert_eq!(
    date!(2019 - 01 - 02).previous_day(),
    Some(date!(2019 - 01 - 01))
);
assert_eq!(
    date!(2019 - 02 - 01).previous_day(),
    Some(date!(2019 - 01 - 31))
);
assert_eq!(
    date!(2020 - 01 - 01).previous_day(),
    Some(date!(2019 - 12 - 31))
);
assert_eq!(Date::MIN.previous_day(), None);

Get the Julian day for the date.

The algorithm to perform this conversion is derived from one provided by Peter Baum; it is freely available here.

assert_eq!(date!(-4713 - 11 - 24).to_julian_day(), 0);
assert_eq!(date!(2000 - 01 - 01).to_julian_day(), 2_451_545);
assert_eq!(date!(2019 - 01 - 01).to_julian_day(), 2_458_485);
assert_eq!(date!(2019 - 12 - 31).to_julian_day(), 2_458_849);

Computes self + duration, returning None if an overflow occurred.

assert_eq!(Date::MAX.checked_add(1.days()), None);
assert_eq!(Date::MIN.checked_add((-2).days()), None);
assert_eq!(
    date!(2020 - 12 - 31).checked_add(2.days()),
    Some(date!(2021 - 01 - 02))
);
Note

This function only takes whole days into account.

assert_eq!(Date::MAX.checked_add(23.hours()), Some(Date::MAX));
assert_eq!(Date::MIN.checked_add((-23).hours()), Some(Date::MIN));
assert_eq!(
    date!(2020 - 12 - 31).checked_add(23.hours()),
    Some(date!(2020 - 12 - 31))
);
assert_eq!(
    date!(2020 - 12 - 31).checked_add(47.hours()),
    Some(date!(2021 - 01 - 01))
);

Computes self - duration, returning None if an overflow occurred.

assert_eq!(Date::MAX.checked_sub((-2).days()), None);
assert_eq!(Date::MIN.checked_sub(1.days()), None);
assert_eq!(
    date!(2020 - 12 - 31).checked_sub(2.days()),
    Some(date!(2020 - 12 - 29))
);
Note

This function only takes whole days into account.

assert_eq!(Date::MAX.checked_sub((-23).hours()), Some(Date::MAX));
assert_eq!(Date::MIN.checked_sub(23.hours()), Some(Date::MIN));
assert_eq!(
    date!(2020 - 12 - 31).checked_sub(23.hours()),
    Some(date!(2020 - 12 - 31))
);
assert_eq!(
    date!(2020 - 12 - 31).checked_sub(47.hours()),
    Some(date!(2020 - 12 - 30))
);

Computes self + duration, saturating value on overflow.

assert_eq!(Date::MAX.saturating_add(1.days()), Date::MAX);
assert_eq!(Date::MIN.saturating_add((-2).days()), Date::MIN);
assert_eq!(
    date!(2020 - 12 - 31).saturating_add(2.days()),
    date!(2021 - 01 - 02)
);
Note

This function only takes whole days into account.

assert_eq!(
    date!(2020 - 12 - 31).saturating_add(23.hours()),
    date!(2020 - 12 - 31)
);
assert_eq!(
    date!(2020 - 12 - 31).saturating_add(47.hours()),
    date!(2021 - 01 - 01)
);

Computes self - duration, saturating value on overflow.

assert_eq!(Date::MAX.saturating_sub((-2).days()), Date::MAX);
assert_eq!(Date::MIN.saturating_sub(1.days()), Date::MIN);
assert_eq!(
    date!(2020 - 12 - 31).saturating_sub(2.days()),
    date!(2020 - 12 - 29)
);
Note

This function only takes whole days into account.

assert_eq!(
    date!(2020 - 12 - 31).saturating_sub(23.hours()),
    date!(2020 - 12 - 31)
);
assert_eq!(
    date!(2020 - 12 - 31).saturating_sub(47.hours()),
    date!(2020 - 12 - 30)
);

Replace the year. The month and day will be unchanged.

assert_eq!(
    date!(2022 - 02 - 18).replace_year(2019),
    Ok(date!(2019 - 02 - 18))
);
assert!(date!(2022 - 02 - 18).replace_year(-1_000_000_000).is_err()); // -1_000_000_000 isn't a valid year
assert!(date!(2022 - 02 - 18).replace_year(1_000_000_000).is_err()); // 1_000_000_000 isn't a valid year

Replace the month of the year.

assert_eq!(
    date!(2022 - 02 - 18).replace_month(Month::January),
    Ok(date!(2022 - 01 - 18))
);
assert!(
    date!(2022 - 01 - 30)
        .replace_month(Month::February)
        .is_err()
); // 30 isn't a valid day in February

Replace the day of the month.

assert_eq!(
    date!(2022 - 02 - 18).replace_day(1),
    Ok(date!(2022 - 02 - 01))
);
assert!(date!(2022 - 02 - 18).replace_day(0).is_err()); // 0 isn't a valid day
assert!(date!(2022 - 02 - 18).replace_day(30).is_err()); // 30 isn't a valid day in February

Methods to add a Time component, resulting in a PrimitiveDateTime.

Create a PrimitiveDateTime using the existing date. The Time component will be set to midnight.

assert_eq!(date!(1970-01-01).midnight(), datetime!(1970-01-01 0:00));

Create a PrimitiveDateTime using the existing date and the provided Time.

assert_eq!(
    date!(1970-01-01).with_time(time!(0:00)),
    datetime!(1970-01-01 0:00),
);

Attempt to create a PrimitiveDateTime using the existing date and the provided time.

assert!(date!(1970 - 01 - 01).with_hms(0, 0, 0).is_ok());
assert!(date!(1970 - 01 - 01).with_hms(24, 0, 0).is_err());

Attempt to create a PrimitiveDateTime using the existing date and the provided time.

assert!(date!(1970 - 01 - 01).with_hms_milli(0, 0, 0, 0).is_ok());
assert!(date!(1970 - 01 - 01).with_hms_milli(24, 0, 0, 0).is_err());

Attempt to create a PrimitiveDateTime using the existing date and the provided time.

assert!(date!(1970 - 01 - 01).with_hms_micro(0, 0, 0, 0).is_ok());
assert!(date!(1970 - 01 - 01).with_hms_micro(24, 0, 0, 0).is_err());

Attempt to create a PrimitiveDateTime using the existing date and the provided time.

assert!(date!(1970 - 01 - 01).with_hms_nano(0, 0, 0, 0).is_ok());
assert!(date!(1970 - 01 - 01).with_hms_nano(24, 0, 0, 0).is_err());

Format the Date using the provided format description.

Format the Date using the provided format description.

let format = format_description::parse("[year]-[month]-[day]")?;
assert_eq!(date!(2020 - 01 - 02).format(&format)?, "2020-01-02");

Parse a Date from the input using the provided format description.

let format = format_description::parse("[year]-[month]-[day]")?;
assert_eq!(Date::parse("2020-01-02", &format)?, date!(2020 - 01 - 02));

Trait Implementations

The resulting type after applying the + operator.
Performs the + operation. Read more
The resulting type after applying the + operator.
Performs the + operation. Read more
Performs the += operation. Read more
Performs the += operation. Read more
Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Decode a new value of this type using a raw value from the database.
Decode a new value of this type using a raw value from the database.
Decode a new value of this type using a raw value from the database.
Deserialize this value from the given Serde deserializer. Read more
Formats the value using the given formatter. Read more
Writes the value of self into buf without moving self. Read more
Writes the value of self into buf in the expected format for the database.
Writes the value of self into buf without moving self. Read more
Writes the value of self into buf in the expected format for the database.
Writes the value of self into buf without moving self. Read more
Writes the value of self into buf in the expected format for the database.
Converts to this type from the input type.
Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
Method to perform the conversion
This method returns an Ordering between self and other. Read more
Compares and returns the maximum of two values. Read more
Compares and returns the minimum of two values. Read more
Restrict a value to a certain interval. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method returns an ordering between self and other values if one exists. Read more
This method tests less than (for self and other) and is used by the < operator. Read more
This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
This method tests greater than (for self and other) and is used by the > operator. Read more
This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Serialize this value into the given Serde serializer. Read more
The resulting type after applying the - operator.
Performs the - operation. Read more
The resulting type after applying the - operator.
Performs the - operation. Read more
The resulting type after applying the - operator.
Performs the - operation. Read more
Performs the -= operation. Read more
Performs the -= operation. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The method to convert the type to a u64
Ensure the type implements this method
Returns the canonical SQL type for this Rust type. Read more
Determines if this Rust type is compatible with the given SQL type. Read more
Returns the canonical SQL type for this Rust type. Read more
Determines if this Rust type is compatible with the given SQL type. Read more
Returns the canonical SQL type for this Rust type. Read more
Determines if this Rust type is compatible with the given SQL type. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Compare self to key and return true if they are equal.

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

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

Should always be Self
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
Converts the given value to a String. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more