pub struct PrimitiveDateTime { /* private fields */ }
Available on crate feature time only.
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 enabled.
assert_eq!(PrimitiveDateTime::MIN, datetime!(-999999 - 01 - 01 0:00));

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 enabled.
assert_eq!(PrimitiveDateTime::MAX, datetime!(+999999 - 12 - 31 23:59:59.999_999_999));

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),
);

Get the Date component of the PrimitiveDateTime.

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

Get the Time component of the PrimitiveDateTime.

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

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);

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);

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);

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);

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);

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);

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);

Get the year, month, and day.

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

Get the year and ordinal day number.

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

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)
);

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);

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);

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));

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)
);

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)
);

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)
);

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);

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);

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);

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);

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
);

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,
);

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,
);

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,
);

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))
);

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))
);

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)
);

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)
);

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)
);

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)
);

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

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

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

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

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

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

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

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

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

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

Formats the value using the given formatter. Read more

Returns the value, None being a null value, copying the value.

Returns the value, None being a null value, taking the ownership.

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 !=.

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

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

Convert to a value understood by the SQL Server. Conversion by-reference. 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

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.

The resulting type after obtaining ownership.

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

🔬 This is a nightly-only experimental API. (toowned_clone_into)

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