Skip to main content

readme/
readme.rs

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