deep-time
A fully featured and high performance Rust date and time library with attosecond precision that aims to blend astronomical and civil timekeeping.
Overview
A non-exhaustive list of functionality:
- Auto-parsers for datetimes and durations that handle thousands of formats, relative dates and multiple languages, requires the
parsefeature - No std, no alloc, and wide-spread const fn.
- Extensively validated against outputs from Astropy, Jiff, and other libraries and sources
- Fast ISO parser
- Time scales e.g. UTC with full leap second support, including historical, TT, TAI, TDB, LTC, GPS, etc.
- Strptime
- Strftime (multi-language day and month names available)
- First class timezone support provided by the Rust library jiff enabled with the
jiff-tzfeature. - To and from all kinds of inputs and outputs, functions mostly prefixed with
toandfrom, available on the library's types, see the main time types functions: Dt. Including JD, MJD, Unix, NTP, etc. - Calendar aware and, with the
jiff-tzfeature, timezone aware math - To and from jiff, chrono, and hifitime types
- No-alloc error type with rich tracing
- No-alloc string return type
- Const fn libm math functions
- Safe, saturating arithmetic throughout
- Lunar and Mars modules
- Sidereal time with a const fn implementation of ERFA Equation of the Origins / Equinoxes
- UT1 and EOP
- Light-time (Shapiro delay, etc.)
- Proper time along trajectories
- Relativity: Drift, Spacetime, Position, and Velocity
- CCSDS CUC, CDS, and CCS
Examples
use ;
Installation
Add this to your Cargo.toml in the dependencies section:
[]
= { = "0.1", = ["parse", "jiff-tz"] }
Important: This crate has no default features.
Most users will want to enable at least parse (for the auto-parsers) and jiff-tz (for timezone support and DST-aware calendar math).
Feature Flags
| Feature | Description | Requires |
|---|---|---|
parse |
Enables the powerful multi-language auto-parsers (from_str_parse, from_str_duration, etc.) |
alloc |
jiff-tz |
Enables timezone-aware calendar math (add_days_tz, add_hr_tz, etc.) and to_str_in_tz |
std |
jiff-tz-bundle |
Same as jiff-tz but bundles the full timezone database |
std |
jiff |
Enables basic Jiff interop | alloc |
chrono |
Enables Chrono interop | alloc |
hifitime |
Enables Hifitime interop | — |
serde |
Enables Serialize / Deserialize for Dt and other types |
— |
js |
WebAssembly support (includes serde and JS bindings) |
std |
tsify |
TypeScript definitions via tsify (for WASM) |
js |
std |
Enables std functionality (including Dt::now()) |
— |
alloc |
Enables allocation (required for parsing and some conversions) | — |
es / de / fr |
Individual language support for parsing and formatting | parse (for parsing) |
euro |
Enables all European languages | |
lang |
Enables all languages | euro |
panic-handler |
Provides a simple #[panic_handler] for no_std environments |
no_std |
wire |
Enables wire format (serialization) support | — |
mars |
Enables Mars time support (to_msd, to_mars_ls, etc.) |
— |
sidereal |
Enables sidereal time support | — |
eop |
Enables Earth Orientation Parameters (UT1, etc.) | alloc |
locale |
Enables system locale detection | std |
Optional No-Alloc Panic Handler
deep-time supports no_std + no_alloc environments. When targeting bare-metal or embedded systems, you can enable a minimal panic handler:
[]
= { = "0.1", = ["panic-handler"] }
This provides a simple #[panic_handler] that uses core::hint::spin_loop() (more power-efficient than a plain loop {}).
You only need this if you are building a binary crate in a no_std environment without your own panic handler.
Notes
- The fast ISO 8601 parser (
from_str_iso) works without theparsefeature. - Multi-language parsing requires the
parsefeature, but multi-language formatting works without it. - The
.parse()implementation onDtautomatically chooses between the full parser and the ISO parser depending on enabled features.
Performance
Benchmarks were measured on an AMD Ryzen 7 7800X3D.
Parsing and Formatting
| Operation | Time | vs Jiff 0.2.28 |
|---|---|---|
| ISO datetime parsing | 17.7 ns | 33.4% faster |
strptime |
34.5 ns | 16.0% faster |
TZ strptime -> Dt vs jiff:Zoned |
193 ns | 18.4% slower |
strftime |
93.5 ns | 50.9% slower |
Auto parser (from_str_parse) |
650 ns | — |
Time Scale Conversions
| Conversion | deep-time | hifitime 4.3 | Relative Performance |
|---|---|---|---|
| TAI → UTC | 9.7 ns | 45.2 ns | 4.6× faster |
| UTC → TAI | 13.0 ns | 47.2 ns | 3.6× faster |
| TAI → TDB | 136 ns | 90.3 ns | 1.5× slower |
| TDB → TAI | 599 ns | 27.0 ns | 22.2× slower |
| GPS conversion | 21.6 ns | 5.3 ns | 4.1× slower |
| GPS week + TOW | 28.0 ns | 7.0 ns | 4.0× slower |
The tests were run with: