Struct ISOWeekDate
struct ISOWeekDate { ... }
A type representing an ISO 8601 week date.
The ISO 8601 week date scheme devises a calendar where days are identified by their year, week number and weekday. All years have either precisely 52 or 53 weeks.
The first week of an ISO 8601 year corresponds to the week containing the
first Thursday of the year. For this reason, an ISO 8601 week year can be
mismatched with the day's corresponding Gregorian year. For example, the
ISO 8601 week date for 1995-01-01 is 1994-W52-7 (with 7 corresponding
to Sunday).
ISO 8601 also considers Monday to be the start of the week, and uses
a 1-based numbering system. That is, Monday corresponds to 1 while
Sunday corresponds to 7 and is the last day of the week. Weekdays are
encapsulated by the Weekday type, which provides routines for easily
converting between different schemes (such as weeks where Sunday is the
beginning).
Use case
Some domains use this method of timekeeping. Otherwise, unless you specifically want a week oriented calendar, it's likely that you'll never need to care about this type.
Default value
For convenience, this type implements the Default trait. Its default
value is the first day of the zeroth year. i.e., 0000-W1-1.
Example: sample dates
This example shows a couple ISO 8601 week dates and their corresponding Gregorian equivalents:
use ;
let d = date;
let weekdate = new.unwrap;
assert_eq!;
let d = date;
let weekdate = new.unwrap;
assert_eq!;
Example: overlapping leap and long years
A "long" ISO 8601 week year is a year with 53 weeks. That is, it is a year that includes a leap week. This example shows all years in the 20th century that are both Gregorian leap years and long years.
use date;
let mut overlapping = vec!;
for year in 1900..=1999
assert_eq!;
Example: printing all weeks in a year
The ISO 8601 week calendar can be useful when you want to categorize things into buckets of weeks where all weeks are exactly 7 days, and you don't care as much about the precise Gregorian year. Here's an example that prints all of the ISO 8601 weeks in one ISO 8601 week year:
use ;
let target_year = 2024;
let iso_week_date = new?;
// Create a series of dates via the Gregorian calendar. But since a
// Gregorian week and an ISO 8601 week calendar week are both 7 days,
// this works fine.
let weeks = iso_week_date
.date
.series
.map
.take_while;
for start_of_week in weeks
# Ok::
Implementations
impl ISOWeekDate
fn new(year: i16, week: i8, weekday: Weekday) -> Result<ISOWeekDate, Error>Create a new ISO week date from it constituent parts.
If the given values are out of range (based on what is representable as a
Date), then this returns an error. This will also return an error if a leap week is given (week number53) for a year that does not contain a leap week.Example
This example shows some the boundary conditions involving minimum and maximum dates:
use ; // The year 1949 does not contain a leap week. assert!; // Examples of dates at or exceeding the maximum. let max = new.unwrap; assert_eq!; assert_eq!; assert!; assert!; // Examples of dates at or exceeding the minimum. let min = new.unwrap; assert_eq!; assert_eq!; assert!;fn from_date(date: Date) -> ISOWeekDateConverts a Gregorian date to an ISO week date.
The minimum and maximum allowed values of an ISO week date are set based on the minimum and maximum values of a
Date. Therefore, converting to and fromDatevalues is non-lossy and infallible.This routine is equivalent to
Date::iso_week_date. This routine is also available via aFrom<Date>trait implementation forISOWeekDate.Example
use ; let weekdate = from_date; assert_eq!;fn year(self: Self) -> i16Returns the year component of this ISO 8601 week date.
The value returned is guaranteed to be in the range
-9999..=9999.Example
use date; let weekdate = date.iso_week_date; assert_eq!;fn week(self: Self) -> i8Returns the week component of this ISO 8601 week date.
The value returned is guaranteed to be in the range
1..=53. A value of53can only occur for "long" years. That is, years with a leap week. This occurs precisely in cases for whichISOWeekDate::in_long_yearreturnstrue.Example
use date; let weekdate = date.iso_week_date; assert_eq!; assert_eq!; let weekdate = date.iso_week_date; assert_eq!; assert_eq!;fn weekday(self: Self) -> WeekdayReturns the day component of this ISO 8601 week date.
One can use methods on
Weekdaysuch asWeekday::to_monday_one_offsetandWeekday::to_sunday_zero_offsetto convert the weekday to a number.Example
use ; let weekdate = date.iso_week_date; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!;fn first_of_week(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 week date corresponding to the first day in the week of this week date. The date returned is guaranteed to have a weekday of
Weekday::Monday.Errors
Since
-9999-01-01falls on a Monday, it follows that the minimum support Gregorian date is exactly equivalent to the minimum supported ISO 8601 week date. This means that this routine can never actually fail, but only insomuch as the minimums line up. For that reason, and for consistency withISOWeekDate::last_of_week, the API is fallible.Example
use ; let wd = new.unwrap; assert_eq!; assert_eq!; // Works even for the minimum date. assert_eq!; # Ok::fn last_of_week(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 week date corresponding to the last day in the week of this week date. The date returned is guaranteed to have a weekday of
Weekday::Sunday.Errors
This can return an error if the last day of the week exceeds Jiff's maximum Gregorian date of
9999-12-31. It turns out this can happen since9999-12-31falls on a Friday.Example
use ; let wd = new.unwrap; assert_eq!; assert_eq!; // Unlike `first_of_week`, this routine can actually fail on real // values, although, only when close to the maximum supported date. assert_eq!; # Ok::fn first_of_year(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 week date corresponding to the first day in the year of this week date. The date returned is guaranteed to have a weekday of
Weekday::Monday.Errors
Since
-9999-01-01falls on a Monday, it follows that the minimum support Gregorian date is exactly equivalent to the minimum supported ISO 8601 week date. This means that this routine can never actually fail, but only insomuch as the minimums line up. For that reason, and for consistency withISOWeekDate::last_of_year, the API is fallible.Example
use ; let wd = new.unwrap; assert_eq!; assert_eq!; // Works even for the minimum date. assert_eq!; # Ok::fn last_of_year(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 week date corresponding to the last day in the year of this week date. The date returned is guaranteed to have a weekday of
Weekday::Sunday.Errors
This can return an error if the last day of the year exceeds Jiff's maximum Gregorian date of
9999-12-31. It turns out this can happen since9999-12-31falls on a Friday.Example
use ; let wd = new.unwrap; assert_eq!; assert_eq!; // Works correctly for "long" years. let wd = new.unwrap; assert_eq!; assert_eq!; // Unlike `first_of_year`, this routine can actually fail on real // values, although, only when close to the maximum supported date. assert_eq!; # Ok::fn days_in_year(self: Self) -> i16Returns the total number of days in the year of this ISO 8601 week date.
It is guaranteed that the value returned is either 364 or 371. The latter case occurs precisely when
ISOWeekDate::in_long_yearreturnstrue.Example
use ; let weekdate = new.unwrap; assert_eq!; let weekdate = new.unwrap; assert_eq!;fn weeks_in_year(self: Self) -> i8Returns the total number of weeks in the year of this ISO 8601 week date.
It is guaranteed that the value returned is either 52 or 53. The latter case occurs precisely when
ISOWeekDate::in_long_yearreturnstrue.Example
use ; let weekdate = new.unwrap; assert_eq!; let weekdate = new.unwrap; assert_eq!;fn in_long_year(self: Self) -> boolReturns true if and only if the year of this week date is a "long" year.
A long year is one that contains precisely 53 weeks. All other years contain precisely 52 weeks.
Example
use ; let weekdate = new.unwrap; assert!; let weekdate = new.unwrap; assert!;fn tomorrow(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 date immediately following this one.
Errors
This returns an error when this date is the maximum value.
Example
use ; let wd = new.unwrap; assert_eq!; // The max doesn't have a tomorrow. assert!; # Ok::fn yesterday(self: Self) -> Result<ISOWeekDate, Error>Returns the ISO 8601 week date immediately preceding this one.
Errors
This returns an error when this date is the minimum value.
Example
use ; let wd = new.unwrap; assert_eq!; // The min doesn't have a yesterday. assert!; # Ok::fn date(self: Self) -> DateConverts this ISO week date to a Gregorian
Date.The minimum and maximum allowed values of an ISO week date are set based on the minimum and maximum values of a
Date. Therefore, converting to and fromDatevalues is non-lossy and infallible.This routine is equivalent to
Date::from_iso_week_date.Example
use ; let weekdate = new.unwrap; assert_eq!;
impl Clone for ISOWeekDate
fn clone(self: &Self) -> ISOWeekDate
impl Copy for ISOWeekDate
impl Debug for ISOWeekDate
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Default for ISOWeekDate
fn default() -> ISOWeekDate
impl Eq for ISOWeekDate
impl Freeze for ISOWeekDate
impl From for ISOWeekDate
fn from(dt: DateTime) -> ISOWeekDate
impl From for ISOWeekDate
fn from(date: Date) -> ISOWeekDate
impl From for ISOWeekDate
fn from(zdt: Zoned) -> ISOWeekDate
impl Hash for ISOWeekDate
fn hash<__H: $crate::hash::Hasher>(self: &Self, state: &mut __H)
impl Ord for ISOWeekDate
fn cmp(self: &Self, other: &ISOWeekDate) -> Ordering
impl PartialEq for ISOWeekDate
fn eq(self: &Self, other: &ISOWeekDate) -> bool
impl PartialOrd for ISOWeekDate
fn partial_cmp(self: &Self, other: &ISOWeekDate) -> Option<Ordering>
impl RefUnwindSafe for ISOWeekDate
impl Send for ISOWeekDate
impl Sync for ISOWeekDate
impl Unpin for ISOWeekDate
impl UnsafeUnpin for ISOWeekDate
impl UnwindSafe for ISOWeekDate
impl<'a> From for ISOWeekDate
fn from(zdt: &'a Zoned) -> ISOWeekDate
impl<T> Any for ISOWeekDate
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for ISOWeekDate
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for ISOWeekDate
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for ISOWeekDate
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for ISOWeekDate
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for ISOWeekDate
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T, U> Into for ISOWeekDate
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for ISOWeekDate
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for ISOWeekDate
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>