pub struct PrimitiveDateTime(_);
Expand description

Combined date and time.

Implementations

The smallest value that can be represented by PrimitiveDateTime.

Depending on large-dates feature flag, value of this constant may vary.

  1. With large-dates disabled it is equal to -9999-01-01 00:00:00.0
  2. With large-dates enabled it is equal to -999999-01-01 00:00:00.0
// Assuming `large-dates` feature is disabled.
assert_eq!(PrimitiveDateTime::MIN, datetime!(-9999-01-01 0:00));
Run

The largest value that can be represented by PrimitiveDateTime.

Depending on large-dates feature flag, value of this constant may vary.

  1. With large-dates disabled it is equal to 9999-12-31 23:59:59.999_999_999
  2. With large-dates enabled it is equal to 999999-12-31 23:59:59.999_999_999
// Assuming `large-dates` feature is disabled.
assert_eq!(PrimitiveDateTime::MAX, datetime!(+9999-12-31 23:59:59.999_999_999));
Run

Create a new PrimitiveDateTime from the provided Date and Time.

assert_eq!(
    PrimitiveDateTime::new(date!(2019-01-01), time!(0:00)),
    datetime!(2019-01-01 0:00),
);
Run

Get the Date component of the PrimitiveDateTime.

assert_eq!(datetime!(2019-01-01 0:00).date(), date!(2019-01-01));
Run

Get the Time component of the PrimitiveDateTime.

assert_eq!(datetime!(2019-01-01 0:00).time(), time!(0:00));
Run

Get the year of the date.

assert_eq!(datetime!(2019-01-01 0:00).year(), 2019);
assert_eq!(datetime!(2019-12-31 0:00).year(), 2019);
assert_eq!(datetime!(2020-01-01 0:00).year(), 2020);
Run

Get the month of the date.

assert_eq!(datetime!(2019-01-01 0:00).month(), Month::January);
assert_eq!(datetime!(2019-12-31 0:00).month(), Month::December);
Run

Get the day of the date.

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

assert_eq!(datetime!(2019-01-01 0:00).day(), 1);
assert_eq!(datetime!(2019-12-31 0:00).day(), 31);
Run

Get the day of the year.

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

assert_eq!(datetime!(2019-01-01 0:00).ordinal(), 1);
assert_eq!(datetime!(2019-12-31 0:00).ordinal(), 365);
Run

Get the ISO week number.

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

assert_eq!(datetime!(2019-01-01 0:00).iso_week(), 1);
assert_eq!(datetime!(2019-10-04 0:00).iso_week(), 40);
assert_eq!(datetime!(2020-01-01 0:00).iso_week(), 1);
assert_eq!(datetime!(2020-12-31 0:00).iso_week(), 53);
assert_eq!(datetime!(2021-01-01 0:00).iso_week(), 53);
Run

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!(datetime!(2019-01-01 0:00).sunday_based_week(), 0);
assert_eq!(datetime!(2020-01-01 0:00).sunday_based_week(), 0);
assert_eq!(datetime!(2020-12-31 0:00).sunday_based_week(), 52);
assert_eq!(datetime!(2021-01-01 0:00).sunday_based_week(), 0);
Run

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!(datetime!(2019-01-01 0:00).monday_based_week(), 0);
assert_eq!(datetime!(2020-01-01 0:00).monday_based_week(), 0);
assert_eq!(datetime!(2020-12-31 0:00).monday_based_week(), 52);
assert_eq!(datetime!(2021-01-01 0:00).monday_based_week(), 0);
Run

Get the year, month, and day.

assert_eq!(
    datetime!(2019-01-01 0:00).to_calendar_date(),
    (2019, Month::January, 1)
);
Run

Get the year and ordinal day number.

assert_eq!(datetime!(2019-01-01 0:00).to_ordinal_date(), (2019, 1));
Run

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

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

Get the weekday.

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

Get the Julian day for the date. The time is not taken into account for this calculation.

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

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

Get the clock hour, minute, and second.

assert_eq!(datetime!(2020-01-01 0:00:00).as_hms(), (0, 0, 0));
assert_eq!(datetime!(2020-01-01 23:59:59).as_hms(), (23, 59, 59));
Run

Get the clock hour, minute, second, and millisecond.

assert_eq!(datetime!(2020-01-01 0:00:00).as_hms_milli(), (0, 0, 0, 0));
assert_eq!(
    datetime!(2020-01-01 23:59:59.999).as_hms_milli(),
    (23, 59, 59, 999)
);
Run

Get the clock hour, minute, second, and microsecond.

assert_eq!(datetime!(2020-01-01 0:00:00).as_hms_micro(), (0, 0, 0, 0));
assert_eq!(
    datetime!(2020-01-01 23:59:59.999_999).as_hms_micro(),
    (23, 59, 59, 999_999)
);
Run

Get the clock hour, minute, second, and nanosecond.

assert_eq!(datetime!(2020-01-01 0:00:00).as_hms_nano(), (0, 0, 0, 0));
assert_eq!(
    datetime!(2020-01-01 23:59:59.999_999_999).as_hms_nano(),
    (23, 59, 59, 999_999_999)
);
Run

Get the clock hour.

The returned value will always be in the range 0..24.

assert_eq!(datetime!(2019-01-01 0:00).hour(), 0);
assert_eq!(datetime!(2019-01-01 23:59:59).hour(), 23);
Run

Get the minute within the hour.

The returned value will always be in the range 0..60.

assert_eq!(datetime!(2019-01-01 0:00).minute(), 0);
assert_eq!(datetime!(2019-01-01 23:59:59).minute(), 59);
Run

Get the second within the minute.

The returned value will always be in the range 0..60.

assert_eq!(datetime!(2019-01-01 0:00).second(), 0);
assert_eq!(datetime!(2019-01-01 23:59:59).second(), 59);
Run

Get the milliseconds within the second.

The returned value will always be in the range 0..1_000.

assert_eq!(datetime!(2019-01-01 0:00).millisecond(), 0);
assert_eq!(datetime!(2019-01-01 23:59:59.999).millisecond(), 999);
Run

Get the microseconds within the second.

The returned value will always be in the range 0..1_000_000.

assert_eq!(datetime!(2019-01-01 0:00).microsecond(), 0);
assert_eq!(
    datetime!(2019-01-01 23:59:59.999_999).microsecond(),
    999_999
);
Run

Get the nanoseconds within the second.

The returned value will always be in the range 0..1_000_000_000.

assert_eq!(datetime!(2019-01-01 0:00).nanosecond(), 0);
assert_eq!(
    datetime!(2019-01-01 23:59:59.999_999_999).nanosecond(),
    999_999_999,
);
Run

Assuming that the existing PrimitiveDateTime represents a moment in the provided UtcOffset, return an OffsetDateTime.

assert_eq!(
    datetime!(2019-01-01 0:00)
        .assume_offset(offset!(UTC))
        .unix_timestamp(),
    1_546_300_800,
);
assert_eq!(
    datetime!(2019-01-01 0:00)
        .assume_offset(offset!(-1))
        .unix_timestamp(),
    1_546_304_400,
);
Run

Assuming that the existing PrimitiveDateTime represents a moment in UTC, return an OffsetDateTime.

assert_eq!(
    datetime!(2019-01-01 0:00).assume_utc().unix_timestamp(),
    1_546_300_800,
);
Run

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

let datetime = Date::MIN.midnight();
assert_eq!(datetime.checked_add((-2).days()), None);

let datetime = Date::MAX.midnight();
assert_eq!(datetime.checked_add(1.days()), None);

assert_eq!(
    datetime!(2019 - 11 - 25 15:30).checked_add(27.hours()),
    Some(datetime!(2019 - 11 - 26 18:30))
);
Run

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

let datetime = Date::MIN.midnight();
assert_eq!(datetime.checked_sub(2.days()), None);

let datetime = Date::MAX.midnight();
assert_eq!(datetime.checked_sub((-1).days()), None);

assert_eq!(
    datetime!(2019 - 11 - 25 15:30).checked_sub(27.hours()),
    Some(datetime!(2019 - 11 - 24 12:30))
);
Run

Computes self + duration, saturating value on overflow.

assert_eq!(
    PrimitiveDateTime::MIN.saturating_add((-2).days()),
    PrimitiveDateTime::MIN
);

assert_eq!(
    PrimitiveDateTime::MAX.saturating_add(2.days()),
    PrimitiveDateTime::MAX
);

assert_eq!(
    datetime!(2019 - 11 - 25 15:30).saturating_add(27.hours()),
    datetime!(2019 - 11 - 26 18:30)
);
Run

Computes self - duration, saturating value on overflow.

assert_eq!(
    PrimitiveDateTime::MIN.saturating_sub(2.days()),
    PrimitiveDateTime::MIN
);

assert_eq!(
    PrimitiveDateTime::MAX.saturating_sub((-2).days()),
    PrimitiveDateTime::MAX
);

assert_eq!(
    datetime!(2019 - 11 - 25 15:30).saturating_sub(27.hours()),
    datetime!(2019 - 11 - 24 12:30)
);
Run

Methods that replace part of the PrimitiveDateTime.

Replace the time, preserving the date.

assert_eq!(
    datetime!(2020-01-01 17:00).replace_time(time!(5:00)),
    datetime!(2020-01-01 5:00)
);
Run

Replace the date, preserving the time.

assert_eq!(
    datetime!(2020-01-01 12:00).replace_date(date!(2020-01-30)),
    datetime!(2020-01-30 12:00)
);
Run

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

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

Replace the month of the year.

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

Replace the day of the month.

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

Replace the clock hour.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_hour(7),
    Ok(datetime!(2022 - 02 - 18 07:02:03.004_005_006))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_hour(24).is_err()); // 24 isn't a valid hour
Run

Replace the minutes within the hour.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_minute(7),
    Ok(datetime!(2022 - 02 - 18 01:07:03.004_005_006))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_minute(60).is_err()); // 60 isn't a valid minute
Run

Replace the seconds within the minute.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_second(7),
    Ok(datetime!(2022 - 02 - 18 01:02:07.004_005_006))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_second(60).is_err()); // 60 isn't a valid second
Run

Replace the milliseconds within the second.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_millisecond(7),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_millisecond(1_000).is_err()); // 1_000 isn't a valid millisecond
Run

Replace the microseconds within the second.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_microsecond(7_008),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007_008))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_microsecond(1_000_000).is_err()); // 1_000_000 isn't a valid microsecond
Run

Replace the nanoseconds within the second.

assert_eq!(
    datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_nanosecond(7_008_009),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007_008_009))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006).replace_nanosecond(1_000_000_000).is_err()); // 1_000_000_000 isn't a valid nanosecond
Run

Format the PrimitiveDateTime using the provided format description.

Format the PrimitiveDateTime using the provided format description.

let format = format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second]")?;
assert_eq!(
    datetime!(2020-01-02 03:04:05).format(&format)?,
    "2020-01-02 03:04:05"
);
Run

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

let format = format_description!("[year]-[month]-[day] [hour]:[minute]:[second]");
assert_eq!(
    PrimitiveDateTime::parse("2020-01-02 03:04:05", &format)?,
    datetime!(2020-01-02 03:04:05)
);
Run

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
Deserialize this value from the given Serde deserializer. Read more
Formats the value using the given formatter. Read more
Feeds this value into the given [Hasher]. Read more
Feeds a slice of this type into the given [Hasher]. Read more
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.

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

Returns the argument unchanged.

Calls U::from(self).

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

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.