Jiff: Datetime library for Rust
A new Rust datetime library called Jiff is drawing attention for its ambitious attempt to make time, date, and timezone handling both safer and more ergonomic than existing crates like Chrono. Commenters praise its rich API, standards alignment (e.g., with Java’s `java.time` and JS Temporal), and thoughtful design docs, while debating choices such as span syntax, negative durations, omission of first-class leap-second support, and the use of panicking operations like `unwrap`. The thread also touches on broader Rust topics—named arguments, trait-based parsing, licensing choices, and whether a “blessed” datetime library should eventually join the standard library.
Library goals and motivation
- Jiff is a new Rust datetime library aiming for a more ergonomic, “pit of success” API than existing crates like
chrono. - Design docs emphasize correct handling of DST, IANA time zones, calendar arithmetic, roundable durations, and lossless round-trips for zoned datetimes.
- Some see Rust + Chrono as already the best datetime experience they’ve had; others find Chrono correct but rigid and awkward.
API design, traits, and syntax
- The
ToSpansyntax5.days().hours(8).minutes(1)split opinion; alternatives suggested:- Builder-style
Span::new().days(5).hours(8).minutes(1) - Arithmetic
5.days() + 8.hours() + 1.minutes() - Named arguments or struct-default-based patterns, which Rust currently lacks.
- Builder-style
- Discussion of extension traits vs inherent methods:
str.parse()uses the standardFromStrtrait, with type inferred or specified via turbofish; some preferType::parse(str)for explicitness.
Span arithmetic and negative durations
- Jiff does not overload
+forSpan + Span; instead uses methods likechecked_add, especially when months/years require a reference datetime. - Allowing
+only for component-wise addition is seen as too subtly different from reference-based addition. - Spans can be negative, matching ISO 8601-2 and other libraries. Critics argue physical “durations” should be non-negative; proponents say signed spans model concepts like “1 year ago” and simplify APIs.
Time zones, DST, and Olson/Temporal conventions
- Several comments highlight how messy real-world time is (DST, scheduling around midnight/weekends, “tomorrow” semantics).
- Jiff supports IANA zones and the
[Olson/Name]suffix pattern used in Temporal and Java’s time APIs to enable lossless round-trips. - Some users compare favorably to Python’s
pandasand JS’s upcoming Temporal API; others still struggle with timezone conversion ergonomics in Rust.
Leap seconds and TAI vs Unix time
- Multiple commenters criticize Unix-time-based libraries for ignoring leap seconds and want TAI-first representations.
- Jiff deliberately omits leap-second-aware core semantics (though TAI-like support via tzif data is possible), arguing:
- General-purpose apps rarely need full leap-second correctness.
- Supporting it adds complexity and can introduce more errors than it removes.
- Scientific and astronomy use cases (e.g., asteroid tracking, precise linking of observations) do need leap-second accuracy; the suggested approach is to use specialized libraries (e.g., TAI/astronomy crates) and interop rather than burden the general-purpose library.
Rust language features and ecosystem
- Significant side discussion on:
- Named and optional arguments, struct default fields, and how they might reduce builder boilerplate; proposals exist but are controversial and stalled.
- Whether Rust should add a datetime type to
std; many argue the standard library is intentionally minimal and critical crates should stay outsidestdto allow evolution.
- Logging: Jiff uses the
logcrate as the lowest common denominator;tracinginterops but would be heavier.
Error handling and panics
- Debate over the pervasive use of
unwrap()/expect()in Rust:- Some view it as culturally overused and worry about panics from deep in dependency trees, especially for long-running or kernel-like code.
- Others argue panics (fail-fast) are appropriate for invariant violations and can improve reliability by surfacing bugs early;
Result+?is available when recoverability is desired.
- There is mention of tools like
no_panicto enforce non-panicking code and official Rust docs discussing when to panic vs return errors.
Licensing and ecosystem fit
- Jiff is dual-licensed MIT and Unlicense:
- Unlicense is seen by its users as an ideological statement against copyright and a “do whatever you want” signal.
- Others point out Unlicense has legal issues in some jurisdictions, and MIT is added as a pragmatic fallback for corporate/legal comfort.
- Some commenters argue for copyleft (GPL/LGPL/MPL) to prevent corporate capture; others prefer permissive licenses to avoid forcing downstream code to open-source.
Implementation details and unsafe
- One code snippet uses
from_utf8_uncheckedfor ASCII-only decimal formatting.- A commenter questions whether the micro-optimization justifies added
unsafecomplexity and potential invariant risk. - A micro-benchmark reportedly shows ~15% speedup in that hot path; there is disagreement about the right balance between performance and clarity/safety.
- A commenter questions whether the micro-optimization justifies added
Naming and pronunciation
- The name “Jiff” and its pronunciation (explicitly defined as like “gif” with a soft g, “gem”) generated lighthearted debate.
- Some dislike the name as “pretentious” or confusing; others treat the GIF/GIF joke as harmless bikeshedding.
Overall reception
- Many are enthusiastic, especially given the author’s track record and the depth of the design and comparison docs.
- Skepticism centers on:
- Leap-second correctness.
- Some API choices (method-chained spans, lack of
Span + Span). - Broader Rust ecosystem issues (no named args, tiny stdlib).
- Several commenters plan to adopt Jiff in place of Chrono/time; others are content with existing solutions and view Jiff as another strong option rather than an obvious replacement.