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
impl YmdHms
Sourcepub const fn new(
yr: i64,
mo: u8,
day: u8,
scale: Scale,
hr: u8,
min: u8,
sec: u8,
attos: u64,
) -> YmdHms
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.
Sourcepub const fn add_yr(&self, n: i64) -> Self
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.
Sourcepub const fn add_mo(&self, n: i64) -> Self
pub const fn add_mo(&self, n: i64) -> Self
Adds (or subtracts) calendar months. Negative values subtract.
Sourcepub const fn add_wk(&self, n: i64) -> Self
pub const fn add_wk(&self, n: i64) -> Self
Adds (or subtracts) calendar weeks. Negative values subtract.
Sourcepub const fn add_days(&self, n: i64) -> Self
pub const fn add_days(&self, n: i64) -> Self
Adds (or subtracts) calendar days. Negative values subtract.
Sourcepub const fn add_attos(&self, n: i128) -> Self
pub const fn add_attos(&self, n: i128) -> Self
Adds (or subtracts) attoseconds. Negative values subtract.
Sourcepub const fn add_sec(&self, n: i64) -> Self
pub const fn add_sec(&self, n: i64) -> Self
Adds (or subtracts) whole seconds. Negative values subtract.
Sourcepub const fn add_min(&self, n: i64) -> Self
pub const fn add_min(&self, n: i64) -> Self
Adds (or subtracts) whole minutes. Negative values subtract.
Sourcepub const fn add_hr(&self, n: i64) -> Self
pub const fn add_hr(&self, n: i64) -> Self
Adds (or subtracts) whole hours. Negative values subtract.
Sourcepub const fn day(&self) -> u8
pub const fn day(&self) -> u8
Returns the day-of-month component (1–31, depending on month/year).
Examples found in repository?
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}Sourcepub const fn sec(&self) -> u8
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.
Sourcepub const fn attos(&self) -> u64
pub const fn attos(&self) -> u64
Returns the attosecond (sub-second) component (0 ≤ attos < 10¹⁸).
Examples found in repository?
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}Sourcepub const fn time_scale(&self) -> Scale
pub const fn time_scale(&self) -> Scale
The time scale that the object was created on.
Sourcepub const fn iso_yr(&self) -> i64
pub const fn iso_yr(&self) -> i64
Returns the ISO week year (can differ from the calendar year near January 1 / December 31).
Sourcepub const fn iso_wk(&self) -> u8
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.
Sourcepub const fn day_of_yr(&self) -> u16
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).
Sourcepub const fn wkday(&self) -> u8
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).
Sourcepub const fn wk_of_yr_sun(&self) -> u8
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).
Sourcepub const fn wk_of_yr_mon(&self) -> u8
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
impl YmdHms
Sourcepub fn add_yr_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_mo_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_wk_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_days_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_hr_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_min_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Sourcepub fn add_sec_tz(&self, n: i64, tz: &str) -> Result<Self, DtErr>
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 aDtErr. - If Jiff cannot find the timezone name or if applying the timezone would cause
the
jiff::Zonedto be outside the-9999..=9999year range then aDtErrwithDtErrKind::InvalidTimezoneOffsetis returned.
Trait Implementations§
impl Copy for YmdHms
Source§impl<'de> Deserialize<'de> for YmdHms
impl<'de> Deserialize<'de> for YmdHms
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for YmdHms
impl StructuralPartialEq for YmdHms
Source§impl Tsify for YmdHms
impl Tsify for YmdHms
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}"
const SERIALIZATION_CONFIG: SerializationConfig
type JsType = JsType
fn into_js(&self) -> Result<Self::JsType, Error>where
Self: Serialize,
fn from_js<T>(js: T) -> Result<Self, Error>
Auto Trait Implementations§
impl Freeze for YmdHms
impl RefUnwindSafe for YmdHms
impl Send for YmdHms
impl Sync for YmdHms
impl Unpin for YmdHms
impl UnsafeUnpin for YmdHms
impl UnwindSafe for YmdHms
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.