Skip to main content

YmdHms

Struct YmdHms 

Source
pub struct YmdHms { /* private fields */ }
Expand description

Combined date + time object.

Has calendar aware and, when the jiff-tz feature is enabled, timezone aware math functions.

§Examples

Creating a YmdHms.

use deep_time::{Dt, Scale};

// clamped to 29
let x = Dt::from_ymd(2000, 2, 30, Scale::UTC, 0, 0, 0, 0).to_ymd();

assert_eq!(x.day(), 29);

Adding a year. 2000 is a leap year and Feb. 29th is possible, but 2001 isn’t a leap year so the day is clamped to the 28th.

use deep_time::{Dt, Scale};

let x = Dt::from_ymd(2000, 2, 29, Scale::UTC, 0, 0, 0, 0).to_ymd();
let x = x.add_yr(1);

assert_eq!(x.day(), 28);

Implementations§

Source§

impl YmdHms

Source

pub const fn new( yr: i64, mo: u8, day: u8, scale: Scale, hr: u8, min: u8, sec: u8, attos: u64, ) -> YmdHms

Create a new YmdHms, wrapper around Dt::from_ymd.

Source

pub const fn to_dt(&self) -> Dt

Returns the Dt that was used to make this YmdHms object.

Source

pub const fn add_yr(&self, n: i64) -> Self

Adds (or subtracts) whole years, preserving month and day-of-month.

  • Uses standard last-day-of-month clamping.
  • Negative values subtract.
Source

pub const fn add_mo(&self, n: i64) -> Self

Adds (or subtracts) calendar months. Negative values subtract.

Source

pub const fn add_wk(&self, n: i64) -> Self

Adds (or subtracts) calendar weeks. Negative values subtract.

Source

pub const fn add_days(&self, n: i64) -> Self

Adds (or subtracts) calendar days. Negative values subtract.

Source

pub const fn add_attos(&self, n: i128) -> Self

Adds (or subtracts) attoseconds. Negative values subtract.

Source

pub const fn add_sec(&self, n: i64) -> Self

Adds (or subtracts) whole seconds. Negative values subtract.

Source

pub const fn add_min(&self, n: i64) -> Self

Adds (or subtracts) whole minutes. Negative values subtract.

Source

pub const fn add_hr(&self, n: i64) -> Self

Adds (or subtracts) whole hours. Negative values subtract.

Source

pub const fn yr(&self) -> i64

Returns the year component.

Source

pub const fn mo(&self) -> u8

Returns the month component (1–12).

Source

pub const fn day(&self) -> u8

Returns the day-of-month component (1–31, depending on month/year).

Examples found in repository?
examples/readme.rs (line 105)
3fn main() -> Result<(), DtErr> {
4    // ============================================
5    // Parsing
6    // ============================================
7
8    // Smart auto-parsing (multi-language + timezone)
9    let cfg = ParseCfg {
10        lang: Lang::Fr,
11        ..Default::default()
12    };
13    let dt = Dt::from_str_parse("15 août 2024 à 14:30 [Europe/Paris]", &cfg)?;
14    let s = dt.to_str_rfc9557("Europe/Paris")?;
15    assert_eq!("2024-08-15T14:30:00+02:00[Europe/Paris]", s);
16
17    // or with .parse
18    let dt: Dt = "1 jan 2000 07:00 [America/New_York] TAI".parse()?; // noon
19    assert_eq!(Dt::ZERO, dt);
20
21    // Relative dates are also supported
22    let ref_time = Dt::from_ymd(2026, 6, 16, Scale::UTC, 12, 0, 0, 0);
23    let en_cfg = ParseCfg {
24        ref_time: Some(ref_time),
25        ..Default::default()
26    };
27
28    let dt = Dt::from_str_parse("2 days from now at 9am", &en_cfg)?;
29    assert_eq!(dt, Dt::from_ymd(2026, 6, 18, Scale::UTC, 9, 0, 0, 0));
30
31    let dt = Dt::from_str_parse("next Monday at 14:00", &en_cfg)?;
32    assert_eq!(dt, Dt::from_ymd(2026, 6, 22, Scale::UTC, 14, 0, 0, 0));
33
34    // Relative dates use Dt::now if the `std` feature is enabled and no
35    // ref_time is provided in the ParseCfg
36    let _ = Dt::from_str_parse("next Monday at 14:00", &ParseCfg::DEFAULT)?;
37
38    // Fast ISO parsing with time scale and no alloc output
39    let dt = Dt::from_str_iso("2000-01-01T12:00:00 TAI")?;
40    let lite_str: LiteStr<512> = dt.to_str_lite_iso8601()?;
41    assert_eq!("2000-01-01T12:00:00+00:00", lite_str.as_str());
42
43    // ============================================
44    // Formatting
45    // ============================================
46
47    let s = dt.to_str_in_tz("%A, %d %B %Y %I:%M%P", "America/New_York", Lang::En)?;
48    assert_eq!("Saturday, 01 January 2000 07:00am", s);
49
50    let s = dt.to_str_in_tz("%A, %-d de %B de %Y %H:%M", "America/New_York", Lang::Es)?;
51    assert_eq!("Sábado, 1 de enero de 2000 07:00", s);
52
53    // ============================================
54    // Duration parsing
55    // ============================================
56
57    let span: Dt = Dt::from_str_duration("3 days 12 hours", Lang::En)?;
58    let dur = span.to_str_lite_media_duration();
59    assert_eq!("3:12:00:00", dur.to_string());
60
61    // ============================================
62    // Time scale conversions + round-tripping
63    // ============================================
64
65    let dt = Dt::from_ymd(2000, 1, 1, Scale::TAI, 0, 0, 0, 123456789);
66    let tt = dt.to(Scale::TT);
67    let tdb = tt.to(Scale::TDB);
68    let ltc = tdb.to(Scale::LTC);
69    let utc = ltc.to(Scale::UTC);
70    let tcl = utc.to(Scale::TCL);
71    let tcg = tcl.to(Scale::TCG);
72    let tai = tcg.to_tai();
73
74    // round trips work for pretty much everything except UTCHist
75    assert_eq!(dt, tai);
76    let ymd: YmdHms = tai.to_ymd();
77    assert_eq!(ymd.attos(), 123456789);
78
79    // ============================================
80    // Other conversions
81    // ============================================
82
83    // unix
84    let dt = Dt::from_ymd(1970, 1, 1, Scale::UTC, 0, 0, 0, 0);
85    let unix = dt.to_unix().to_sec_f();
86    assert_eq!(unix, 0.0);
87
88    // or to milliseconds
89    let unix: i128 = dt.add_ms(1000).to_unix().to_ms();
90    assert_eq!(unix, 1000);
91
92    // to and from jd
93    let jd = Dt::ZERO.to_jd_f();
94    assert_eq!(2451545.0, jd);
95    let dt = Dt::from_jd_f(jd, Scale::TAI);
96    assert_eq!(0, dt.attos);
97
98    // ============================================
99    // Calendar math
100    // ============================================
101
102    // calendar math and negative year
103    let dt = Dt::from_ymd(-2000, 1, 31, Scale::TAI, 12, 0, 0, 0);
104    let ymd = dt.add_mo(1).to_ymd();
105    assert_eq!(ymd.day(), 29);
106
107    // Timezone-aware calendar math (respects DST transitions, requires jiff-tz feature)
108    let dt = Dt::from_str_iso("2025-03-30T00:30:00Z")?; // Just before London DST start
109
110    // Normal (naive) addition — ignores DST rules
111    let normal = dt.add_hr(1);
112
113    // Timezone-aware addition — correctly handles the transition
114    let aware = dt.add_hr_tz(1, "Europe/London")?;
115
116    println!("Normal: {}", normal.to_str_rfc9557("Europe/London")?);
117    println!("Aware:  {}", aware.to_str_rfc9557("Europe/London")?);
118
119    // ============================================
120    // Leap seconds
121    // ============================================
122
123    // genuine leap second input round trips
124    let dt: Dt = "2015-06-30T23:59:60".parse()?;
125    let s = dt.to_str_iso8601();
126    assert_eq!("2015-06-30T23:59:60+00:00", s);
127
128    Ok(())
129}
Source

pub const fn hr(&self) -> u8

Returns the hour component (0–23).

Source

pub const fn min(&self) -> u8

Returns the minute component (0–59).

Source

pub const fn sec(&self) -> u8

Returns the second component (0–60). The value 60 only occurs during a positive leap second on Scale::UTC / UtcSpice / UtcHist.

Source

pub const fn attos(&self) -> u64

Returns the attosecond (sub-second) component (0 ≤ attos < 10¹⁸).

Examples found in repository?
examples/readme.rs (line 77)
3fn main() -> Result<(), DtErr> {
4    // ============================================
5    // Parsing
6    // ============================================
7
8    // Smart auto-parsing (multi-language + timezone)
9    let cfg = ParseCfg {
10        lang: Lang::Fr,
11        ..Default::default()
12    };
13    let dt = Dt::from_str_parse("15 août 2024 à 14:30 [Europe/Paris]", &cfg)?;
14    let s = dt.to_str_rfc9557("Europe/Paris")?;
15    assert_eq!("2024-08-15T14:30:00+02:00[Europe/Paris]", s);
16
17    // or with .parse
18    let dt: Dt = "1 jan 2000 07:00 [America/New_York] TAI".parse()?; // noon
19    assert_eq!(Dt::ZERO, dt);
20
21    // Relative dates are also supported
22    let ref_time = Dt::from_ymd(2026, 6, 16, Scale::UTC, 12, 0, 0, 0);
23    let en_cfg = ParseCfg {
24        ref_time: Some(ref_time),
25        ..Default::default()
26    };
27
28    let dt = Dt::from_str_parse("2 days from now at 9am", &en_cfg)?;
29    assert_eq!(dt, Dt::from_ymd(2026, 6, 18, Scale::UTC, 9, 0, 0, 0));
30
31    let dt = Dt::from_str_parse("next Monday at 14:00", &en_cfg)?;
32    assert_eq!(dt, Dt::from_ymd(2026, 6, 22, Scale::UTC, 14, 0, 0, 0));
33
34    // Relative dates use Dt::now if the `std` feature is enabled and no
35    // ref_time is provided in the ParseCfg
36    let _ = Dt::from_str_parse("next Monday at 14:00", &ParseCfg::DEFAULT)?;
37
38    // Fast ISO parsing with time scale and no alloc output
39    let dt = Dt::from_str_iso("2000-01-01T12:00:00 TAI")?;
40    let lite_str: LiteStr<512> = dt.to_str_lite_iso8601()?;
41    assert_eq!("2000-01-01T12:00:00+00:00", lite_str.as_str());
42
43    // ============================================
44    // Formatting
45    // ============================================
46
47    let s = dt.to_str_in_tz("%A, %d %B %Y %I:%M%P", "America/New_York", Lang::En)?;
48    assert_eq!("Saturday, 01 January 2000 07:00am", s);
49
50    let s = dt.to_str_in_tz("%A, %-d de %B de %Y %H:%M", "America/New_York", Lang::Es)?;
51    assert_eq!("Sábado, 1 de enero de 2000 07:00", s);
52
53    // ============================================
54    // Duration parsing
55    // ============================================
56
57    let span: Dt = Dt::from_str_duration("3 days 12 hours", Lang::En)?;
58    let dur = span.to_str_lite_media_duration();
59    assert_eq!("3:12:00:00", dur.to_string());
60
61    // ============================================
62    // Time scale conversions + round-tripping
63    // ============================================
64
65    let dt = Dt::from_ymd(2000, 1, 1, Scale::TAI, 0, 0, 0, 123456789);
66    let tt = dt.to(Scale::TT);
67    let tdb = tt.to(Scale::TDB);
68    let ltc = tdb.to(Scale::LTC);
69    let utc = ltc.to(Scale::UTC);
70    let tcl = utc.to(Scale::TCL);
71    let tcg = tcl.to(Scale::TCG);
72    let tai = tcg.to_tai();
73
74    // round trips work for pretty much everything except UTCHist
75    assert_eq!(dt, tai);
76    let ymd: YmdHms = tai.to_ymd();
77    assert_eq!(ymd.attos(), 123456789);
78
79    // ============================================
80    // Other conversions
81    // ============================================
82
83    // unix
84    let dt = Dt::from_ymd(1970, 1, 1, Scale::UTC, 0, 0, 0, 0);
85    let unix = dt.to_unix().to_sec_f();
86    assert_eq!(unix, 0.0);
87
88    // or to milliseconds
89    let unix: i128 = dt.add_ms(1000).to_unix().to_ms();
90    assert_eq!(unix, 1000);
91
92    // to and from jd
93    let jd = Dt::ZERO.to_jd_f();
94    assert_eq!(2451545.0, jd);
95    let dt = Dt::from_jd_f(jd, Scale::TAI);
96    assert_eq!(0, dt.attos);
97
98    // ============================================
99    // Calendar math
100    // ============================================
101
102    // calendar math and negative year
103    let dt = Dt::from_ymd(-2000, 1, 31, Scale::TAI, 12, 0, 0, 0);
104    let ymd = dt.add_mo(1).to_ymd();
105    assert_eq!(ymd.day(), 29);
106
107    // Timezone-aware calendar math (respects DST transitions, requires jiff-tz feature)
108    let dt = Dt::from_str_iso("2025-03-30T00:30:00Z")?; // Just before London DST start
109
110    // Normal (naive) addition — ignores DST rules
111    let normal = dt.add_hr(1);
112
113    // Timezone-aware addition — correctly handles the transition
114    let aware = dt.add_hr_tz(1, "Europe/London")?;
115
116    println!("Normal: {}", normal.to_str_rfc9557("Europe/London")?);
117    println!("Aware:  {}", aware.to_str_rfc9557("Europe/London")?);
118
119    // ============================================
120    // Leap seconds
121    // ============================================
122
123    // genuine leap second input round trips
124    let dt: Dt = "2015-06-30T23:59:60".parse()?;
125    let s = dt.to_str_iso8601();
126    assert_eq!("2015-06-30T23:59:60+00:00", s);
127
128    Ok(())
129}
Source

pub const fn time_scale(&self) -> Scale

The time scale that the object was created on.

Source

pub const fn iso_yr(&self) -> i64

Returns the ISO week year (can differ from the calendar year near January 1 / December 31).

Source

pub const fn iso_wk(&self) -> u8

Returns the ISO week number (1–53). Weeks start on Monday; week 1 is the week containing the first Thursday of the year.

Source

pub const fn day_of_yr(&self) -> u16

Returns the day of the year (ordinal date), 1-based (Jan 1 = 1, Dec 31 = 365 or 366 in leap years).

Source

pub const fn wkday(&self) -> u8

Returns the weekday number according to Dt::jd_to_wkday (typically 0 = Sunday … 6 = Saturday; exact convention is defined by the Julian Day helper).

Source

pub const fn wk_of_yr_sun(&self) -> u8

Returns the week of year number when weeks are considered to start on Sunday (US-style numbering).

Source

pub const fn wk_of_yr_mon(&self) -> u8

Returns the week of year number when weeks are considered to start on Monday.

Source§

impl YmdHms

Source

pub fn add_yr_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of years in the specified IANA timezone, respecting timezone rules (including DST) and proper calendar arithmetic.

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_mo_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of months in the specified IANA timezone, respecting timezone rules and calendar month-end clamping.

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_wk_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of weeks in the specified IANA timezone.

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_days_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of calendar days in the specified IANA timezone.

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_hr_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of hours in the specified IANA timezone, respecting timezone rules (including DST).

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_min_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of minutes in the specified IANA timezone, respecting timezone rules (including DST).

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.
Source

pub fn add_sec_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>

Adds the given number of seconds in the specified IANA timezone.

§Errors
  • Jiff only supports years in the range -9999..=9999. Years outside this range will return a DtErr.
  • If Jiff cannot find the timezone name or if applying the timezone would cause the jiff::Zoned to be outside the -9999..=9999 year range then a DtErr with DtErrKind::InvalidTimezoneOffset is returned.

Trait Implementations§

Source§

impl Clone for YmdHms

Source§

fn clone(&self) -> YmdHms

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for YmdHms

Source§

impl Debug for YmdHms

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for YmdHms

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for YmdHms

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for YmdHms

Source§

impl Hash for YmdHms

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for YmdHms

Source§

fn eq(&self, other: &YmdHms) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for YmdHms

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for YmdHms

Source§

impl Tsify for YmdHms

Source§

const DECL: &'static str = "/**\n * Combined date + time object.\n *\n * Has calendar aware and, when the `jiff-tz` feature is enabled,\n * timezone aware math functions.\n *\n * ## Examples\n *\n * **Creating a** [`YmdHms`].\n *\n * ```rust\n * use deep_time::{Dt, Scale};\n *\n * // clamped to 29\n * let x = Dt::from_ymd(2000, 2, 30, Scale::UTC, 0, 0, 0, 0).to_ymd();\n *\n * assert_eq!(x.day(), 29);\n * ```\n *\n * **Adding a year.** 2000 is a leap year and Feb. 29th is possible, but\n * 2001 isn\\\'t a leap year so the day is clamped to the 28th.\n *\n * ```rust\n * use deep_time::{Dt, Scale};\n *\n * let x = Dt::from_ymd(2000, 2, 29, Scale::UTC, 0, 0, 0, 0).to_ymd();\n * let x = x.add_yr(1);\n *\n * assert_eq!(x.day(), 28);\n * ```\n */\nexport interface YmdHms {\n yr: number;\n mo: number;\n day: number;\n hr: number;\n min: number;\n sec: number;\n attos: number;\n dt: Dt;\n}"

Source§

const SERIALIZATION_CONFIG: SerializationConfig

Source§

type JsType = JsType

Source§

fn into_js(&self) -> Result<Self::JsType, Error>
where Self: Serialize,

Source§

fn from_js<T>(js: T) -> Result<Self, Error>
where T: Into<JsValue>, Self: DeserializeOwned,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more