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

A PrimitiveDateTime with a UtcOffset.

All comparisons are performed using the UTC time.

Implementations§

Midnight, 1 January, 1970 (UTC).

assert_eq!(OffsetDateTime::UNIX_EPOCH, datetime!(1970-01-01 0:00 UTC),);

Create a new OffsetDateTime with the current date and time in UTC.

assert!(OffsetDateTime::now_utc().year() >= 2019);
assert_eq!(OffsetDateTime::now_utc().offset(), offset!(UTC));

Convert the OffsetDateTime from the current UtcOffset to the provided UtcOffset.

assert_eq!(
    datetime!(2000-01-01 0:00 UTC)
        .to_offset(offset!(-1))
        .year(),
    1999,
);

// Let's see what time Sydney's new year's celebration is in New York and Los Angeles.

// Construct midnight on new year's in Sydney.
let sydney = datetime!(2000-01-01 0:00 +11);
let new_york = sydney.to_offset(offset!(-5));
let los_angeles = sydney.to_offset(offset!(-8));
assert_eq!(sydney.hour(), 0);
assert_eq!(new_york.hour(), 8);
assert_eq!(los_angeles.hour(), 5);
Panics

This method panics if the local date-time in the new offset is outside the supported range.

Create an OffsetDateTime from the provided Unix timestamp. Calling .offset() on the resulting value is guaranteed to return UTC.

assert_eq!(
    OffsetDateTime::from_unix_timestamp(0),
    Ok(OffsetDateTime::UNIX_EPOCH),
);
assert_eq!(
    OffsetDateTime::from_unix_timestamp(1_546_300_800),
    Ok(datetime!(2019-01-01 0:00 UTC)),
);

If you have a timestamp-nanosecond pair, you can use something along the lines of the following:

let (timestamp, nanos) = (1, 500_000_000);
assert_eq!(
    OffsetDateTime::from_unix_timestamp(timestamp)? + Duration::nanoseconds(nanos),
    OffsetDateTime::UNIX_EPOCH + 1.5.seconds()
);

Construct an OffsetDateTime from the provided Unix timestamp (in nanoseconds). Calling .offset() on the resulting value is guaranteed to return UTC.

assert_eq!(
    OffsetDateTime::from_unix_timestamp_nanos(0),
    Ok(OffsetDateTime::UNIX_EPOCH),
);
assert_eq!(
    OffsetDateTime::from_unix_timestamp_nanos(1_546_300_800_000_000_000),
    Ok(datetime!(2019-01-01 0:00 UTC)),
);

Get the UtcOffset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).offset(), offset!(UTC));
assert_eq!(datetime!(2019-01-01 0:00 +1).offset(), offset!(+1));

Get the Unix timestamp.

assert_eq!(datetime!(1970-01-01 0:00 UTC).unix_timestamp(), 0);
assert_eq!(datetime!(1970-01-01 0:00 -1).unix_timestamp(), 3_600);

Get the Unix timestamp in nanoseconds.

use time_macros::datetime;
assert_eq!(datetime!(1970-01-01 0:00 UTC).unix_timestamp_nanos(), 0);
assert_eq!(
    datetime!(1970-01-01 0:00 -1).unix_timestamp_nanos(),
    3_600_000_000_000,
);

Get the Date in the stored offset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).date(), date!(2019-01-01));
assert_eq!(
    datetime!(2019-01-01 0:00 UTC)
        .to_offset(offset!(-1))
        .date(),
    date!(2018-12-31),
);

Get the Time in the stored offset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).time(), time!(0:00));
assert_eq!(
    datetime!(2019-01-01 0:00 UTC)
        .to_offset(offset!(-1))
        .time(),
    time!(23:00)
);

Get the year of the date in the stored offset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).year(), 2019);
assert_eq!(
    datetime!(2019-12-31 23:00 UTC)
        .to_offset(offset!(+1))
        .year(),
    2020,
);
assert_eq!(datetime!(2020-01-01 0:00 UTC).year(), 2020);

Get the month of the date in the stored offset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).month(), Month::January);
assert_eq!(
    datetime!(2019-12-31 23:00 UTC)
        .to_offset(offset!(+1))
        .month(),
    Month::January,
);

Get the day of the date in the stored offset.

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

assert_eq!(datetime!(2019-01-01 0:00 UTC).day(), 1);
assert_eq!(
    datetime!(2019-12-31 23:00 UTC)
        .to_offset(offset!(+1))
        .day(),
    1,
);

Get the day of the year of the date in the stored offset.

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

assert_eq!(datetime!(2019-01-01 0:00 UTC).ordinal(), 1);
assert_eq!(
    datetime!(2019-12-31 23:00 UTC)
        .to_offset(offset!(+1))
        .ordinal(),
    1,
);

Get the ISO week number of the date in the stored offset.

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

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

Get the year, month, and day.

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

Get the year and ordinal day number.

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

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

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

Get the weekday of the date in the stored offset.

assert_eq!(datetime!(2019-01-01 0:00 UTC).weekday(), Tuesday);
assert_eq!(datetime!(2019-02-01 0:00 UTC).weekday(), Friday);
assert_eq!(datetime!(2019-03-01 0:00 UTC).weekday(), Friday);

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 UTC).to_julian_day(), 0);
assert_eq!(datetime!(2000-01-01 0:00 UTC).to_julian_day(), 2_451_545);
assert_eq!(datetime!(2019-01-01 0:00 UTC).to_julian_day(), 2_458_485);
assert_eq!(datetime!(2019-12-31 0:00 UTC).to_julian_day(), 2_458_849);

Get the clock hour, minute, and second.

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

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

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

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

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

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

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

Get the clock hour in the stored offset.

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

assert_eq!(datetime!(2019-01-01 0:00 UTC).hour(), 0);
assert_eq!(
    datetime!(2019-01-01 23:59:59 UTC)
        .to_offset(offset!(-2))
        .hour(),
    21,
);

Get the minute within the hour in the stored offset.

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

assert_eq!(datetime!(2019-01-01 0:00 UTC).minute(), 0);
assert_eq!(
    datetime!(2019-01-01 23:59:59 UTC)
        .to_offset(offset!(+0:30))
        .minute(),
    29,
);

Get the second within the minute in the stored offset.

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

assert_eq!(datetime!(2019-01-01 0:00 UTC).second(), 0);
assert_eq!(
    datetime!(2019-01-01 23:59:59 UTC)
        .to_offset(offset!(+0:00:30))
        .second(),
    29,
);

Get the milliseconds within the second in the stored offset.

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

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

Get the microseconds within the second in the stored offset.

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

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

Get the nanoseconds within the second in the stored offset.

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

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

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

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

let datetime = Date::MAX.midnight().assume_offset(offset!(+10));
assert_eq!(datetime.checked_add(2.days()), None);

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

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

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

let datetime = Date::MAX.midnight().assume_offset(offset!(+10));
assert_eq!(datetime.checked_sub((-2).days()), None);

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

Computes self + duration, saturating value on overflow.

assert_eq!(
    datetime!(-9999-01-01 0:00 +10).saturating_add((-2).days()),
    datetime!(-9999-01-01 0:00 +10)
);

assert_eq!(
    datetime!(+9999-12-31 23:59:59.999_999_999 +10).saturating_add(2.days()),
    datetime!(+9999-12-31 23:59:59.999_999_999 +10)
);

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

Computes self - duration, saturating value on overflow.

assert_eq!(
    datetime!(-9999-01-01 0:00 +10).saturating_sub(2.days()),
    datetime!(-9999-01-01 0:00 +10)
);

assert_eq!(
    datetime!(+9999-12-31 23:59:59.999_999_999 +10).saturating_sub((-2).days()),
    datetime!(+9999-12-31 23:59:59.999_999_999 +10)
);

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

Methods that replace part of the OffsetDateTime.

Replace the time, which is assumed to be in the stored offset. The date and offset components are unchanged.

assert_eq!(
    datetime!(2020-01-01 5:00 UTC).replace_time(time!(12:00)),
    datetime!(2020-01-01 12:00 UTC)
);
assert_eq!(
    datetime!(2020-01-01 12:00 -5).replace_time(time!(7:00)),
    datetime!(2020-01-01 7:00 -5)
);
assert_eq!(
    datetime!(2020-01-01 0:00 +1).replace_time(time!(12:00)),
    datetime!(2020-01-01 12:00 +1)
);

Replace the date, which is assumed to be in the stored offset. The time and offset components are unchanged.

assert_eq!(
    datetime!(2020-01-01 12:00 UTC).replace_date(date!(2020-01-30)),
    datetime!(2020-01-30 12:00 UTC)
);
assert_eq!(
    datetime!(2020-01-01 0:00 +1).replace_date(date!(2020-01-30)),
    datetime!(2020-01-30 0:00 +1)
);

Replace the date and time, which are assumed to be in the stored offset. The offset component remains unchanged.

assert_eq!(
    datetime!(2020-01-01 12:00 UTC).replace_date_time(datetime!(2020-01-30 16:00)),
    datetime!(2020-01-30 16:00 UTC)
);
assert_eq!(
    datetime!(2020-01-01 12:00 +1).replace_date_time(datetime!(2020-01-30 0:00)),
    datetime!(2020-01-30 0:00 +1)
);

Replace the offset. The date and time components remain unchanged.

assert_eq!(
    datetime!(2020-01-01 0:00 UTC).replace_offset(offset!(-5)),
    datetime!(2020-01-01 0:00 -5)
);

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

assert_eq!(
    datetime!(2022 - 02 - 18 12:00 +01).replace_year(2019),
    Ok(datetime!(2019 - 02 - 18 12:00 +01))
);
assert!(datetime!(2022 - 02 - 18 12:00 +01).replace_year(-1_000_000_000).is_err()); // -1_000_000_000 isn't a valid year
assert!(datetime!(2022 - 02 - 18 12:00 +01).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 +01).replace_month(Month::January),
    Ok(datetime!(2022 - 01 - 18 12:00 +01))
);
assert!(datetime!(2022 - 01 - 30 12:00 +01).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 +01).replace_day(1),
    Ok(datetime!(2022 - 02 - 01 12:00 +01))
);
assert!(datetime!(2022 - 02 - 18 12:00 +01).replace_day(0).is_err()); // 00 isn't a valid day
assert!(datetime!(2022 - 02 - 18 12:00 +01).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 +01).replace_hour(7),
    Ok(datetime!(2022 - 02 - 18 07:02:03.004_005_006 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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 +01).replace_minute(7),
    Ok(datetime!(2022 - 02 - 18 01:07:03.004_005_006 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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 +01).replace_second(7),
    Ok(datetime!(2022 - 02 - 18 01:02:07.004_005_006 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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 +01).replace_millisecond(7),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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 +01).replace_microsecond(7_008),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007_008 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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 +01).replace_nanosecond(7_008_009),
    Ok(datetime!(2022 - 02 - 18 01:02:03.007_008_009 +01))
);
assert!(datetime!(2022 - 02 - 18 01:02:03.004_005_006 +01).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
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
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
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 ==.
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
This method tests for self and other values to be equal, and is used by ==.
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
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
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

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.