Jiff : une toute nouvelle bibliothèque Datetime pour Rust, pour fournir des primitives datetime de haut niveau qui sont difficiles à abuser et ont des performances raisonnables, par l'auteur de ripgrep
Andrew Gallant, l'auteur de ripgrep, présente Jiff qui est une toute nouvelle bibliothèque Datetime pour Rust.
Jiff est une bibliothèque de datetime pour Rust qui vous encourage à sauter dans la fosse du succès. L'objectif de cette bibliothèque est de fournir des primitives de date de haut niveau qui sont difficiles à utiliser à mauvais escient et qui ont des performances raisonnables. Jiff supporte l'intégration automatique et transparente avec la base de données des fuseaux horaires, l'arithmétique et l'arrondi tenant compte de l'heure d'été, le formatage et l'analyse sans perte des dates tenant compte des fuseaux horaires, le support optionnel de Serde et bien d'autres choses encore.
Jiff s'inspire énormément de Temporal, qui est une proposition du TC39 visant à améliorer la gestion des dates en JavaScript.
Exemple
Voici un exemple rapide qui montre comment analyser un instant RFC 3339 typique, le convertir en un datetime sensible à la zone, ajouter un intervalle de temps et l'imprimer sans perte :
Il existe de nombreux autres exemples dans la documentation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 use jiff::{Timestamp, ToSpan}; fn main() -> Result<(), jiff::Error> { let time: Timestamp = "2024-07-11T01:14:00Z".parse()?; let zoned = time.intz("America/New_York")?.checked_add(1.month().hours(2))?; assert_eq!(zoned.to_string(), "2024-08-10T23:14:00-04:00[America/New_York]"); // Or, if you want an RFC3339 formatted string: assert_eq!(zoned.timestamp().to_string(), "2024-08-11T03:14:00Z"); Ok(()) }
Utilisation
Jiff est sur crates.io et peut être utilisé en ajoutant jiff à vos dépendances dans le Cargo.toml de votre projet. Ou plus simplement, il suffit de lancer cargo add jiff.
Voici un exemple complet qui crée un nouveau projet Rust, ajoute une dépendance sur jiff, crée le code source d'un simple programme de date et l'exécute.
Tout d'abord, créez le projet dans un nouveau répertoire :
Deuxièmement, ajoutez une dépendance sur jiff :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $ mkdir jiff-example $ cd jiff-example $ cargo init
Troisièmement, éditer src/main.rs. Supprimez ce qui s'y trouve et remplacez-le par ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $ cargo add jiff
Quatrièmement, exécutez le projet avec cargo run :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 use jiff::{Unit, Zoned}; fn main() -> Result<(), jiff::Error> { let now = Zoned::now().round(Unit::Second)?; println!("{now}"); Ok(()) }
La première fois que vous exécutez le programme, vous obtiendrez plus de résultats comme ci-dessus. Mais les exécutions suivantes ne devraient pas avoir à recompiler les dépendances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $ cargo run Compiling jiff v0.1.0 (/home/andrew/rust/jiff) Compiling jiff-play v0.1.0 (/home/andrew/tmp/scratch/rust/jiff-play) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.37s Running `target/debug/jiff-play` 2024-07-10T19:54:20-04:00[America/New_York]
Fonctionnalités de crate
Jiff dispose de plusieurs fonctionnalités crate pour personnaliser le support de la bibliothèque standard de Rust, le support de serde et l'intégration ou non d'une copie de la base de données des fuseaux horaires dans votre binaire.
La section « crate features » de la documentation liste l'ensemble des fonctionnalités supportées.
Projets futurs
Le plan d'Andrew Gallant est d'itérer sur l'API Jiff et de faire des mises à jour occasionnelles sur les ruptures de l'API au cours de l'année à venir. En supposant que les changements de rupture de l'API se soient stabilisés après environ un an, son plan sera de publier Jiff 1.0 et de s'engager sur l'API pour une longue période de temps. (Mesuré, au moins, en années).
Le but de ce plan est d'amener Jiff à un état stable 1.0 aussi rapidement que possible. La raison en est que d'autres se sentiront à l'aise en s'appuyant sur Jiff en tant que dépendance publique qui ne causera pas de changement dans l'écosystème.
Les performances
L'objectif le plus important de Jiff est d'être une bibliothèque de datetime de haut niveau qui rend difficile toute erreur. Le deuxième objectif est la performance. Jiff devrait avoir des performances raisonnables, mais il y a probablement des domaines dans lesquels il pourrait s'améliorer. Voir le répertoire bench pour des benchmarks.
Support de la plate-forme
La question de la prise en charge des plates-formes dans le contexte des bibliothèques de dates est principalement liée à la prise en charge des fuseaux horaires. Plus précisément :
- Comment Jiff doit-il déterminer les transitions de fuseau horaire pour un identifiant de fuseau horaire IANA comme Antarctica/Troll ?
- Comment Jiff peut-il déterminer le fuseau horaire par défaut du système actuel ?
Ces deux questions nécessitent un certain niveau d'interaction avec la plateforme.
Pour découvrir les données relatives à la transition des fuseaux horaires, Jiff s'appuie sur la base de données des fuseaux horaires de l'IANA. Sur les systèmes Unix, elle se trouve généralement dans /usr/share/zoneinfo, bien qu'elle puisse être configurée via la variable d'environnement TZDIR (que Jiff respecte). Sous Windows, Jiff intègre automatiquement une copie de la base de données des fuseaux horaires dans la bibliothèque compilée.
Pour découvrir le fuseau horaire du système, Jiff lit /etc/localtime sous Unix. Sous Windows, Jiff lit l'identifiant du fuseau horaire spécifique à Windows via GetDynamicTimeZoneInformation, puis l'associe à un identifiant de fuseau horaire IANA via les données XML CLDR d'Unicode.
Andrew Gallant commente :
DépendancesJe m'attends à ce que Jiff prenne de plus en plus en charge d'autres plates-formes au fil du temps. N'hésitez pas à poser des questions, bien que je me fie aux demandes des contributeurs pour les plates-formes plus obscures qu'il ne m'est pas facile de tester.
Actuellement, Jiff n'a aucune dépendance vis-à-vis d'Unix. La philosophie de son auteur sur l'ajout de nouvelles dépendances dans un écosystème comme Jiff est très conservatrice. Il considère qu'il y a deux cas d'utilisation principaux pour l'ajout de nouvelles dépendances :
- Lorsqu'une dépendance est pratiquement nécessaire pour interagir avec une plateforme. Par exemple, windows-sys pour découvrir le fuseau horaire du système sous Windows.
- Lorsqu'une dépendance est nécessaire pour l'interopérabilité. Par exemple, serde. Mais même dans ce cas, l'auteur est conservateur, et n'est pas prêt à dépendre que de choses qui ont moins de versions de rupture que Jiff.
Un cas d'utilisation secondaire pour les nouvelles dépendances est si Jiff est divisé en plusieurs crates. Andrew Gallant a fait la même chose pour le crate regex pour des raisons très convaincantes. Il est possible que cela se produise aussi avec Jiff, bien qu'il n'y ait aucun plan pour cela. Et en général, il s'attend à ce que le nombre de crates reste faible, ne serait-ce que pour alléger la maintenance.
Politique de version minimale de Rust
La version minimale de rustc supportée par ce crate est 1.70.0.
La politique est que la version minimale de Rust requise pour utiliser ce crate peut être augmentée dans les mises à jour de versions mineures. Par exemple, si jiff 1.0 nécessite Rust 1.20.0, alors jiff 1.0.z pour toutes les valeurs de z nécessitera également Rust 1.20.0 ou une version plus récente. Cependant, jiff 1.y pour y > 0 peut nécessiter une version minimale plus récente de Rust.
Source : Présentation de Jiff
Et vous ?
Avez-vous utilisé cet outil ou un outil similaire pour votre usage ou le développement d'applications, et si oui qu'en pensez-vous ?
Voir aussi :
La version 1.72.0 de Rust, le langage de programmation multi-paradigme, est disponible, et intègre plusieurs améliorations ainsi que des API stabilisées
Boosté par les recommandations de la Maison Blanche, Rust atteint sa plus haute position dans l'indice TIOBE, se classant à la 13e place. Il est rentré dans le top 20 pour la première fois en juin 2020
Farm : un outil de construction Web écrit en Rust et qui serait 10 fois plus rapide que Vite et 20 fois plus rapide que Webpack. Il vise à faciliter et à accélérer le développement d'applications Web
Partager