[![htp crate](https://img.shields.io/crates/v/htp.svg)](https://crates.io/crates/htp) [![tbl documentation](https://docs.rs/htp/badge.svg)](https://docs.rs/htp) [![GitHub license](https://img.shields.io/github/license/PicoJr/htp)](https://github.com/PicoJr/htp/blob/master/LICENSE) # HTP Work in progress **H**uman **T**ime **P**arser This lib uses [pest](https://github.com/pest-parser/pest) for parsing. ## Example ```rust use chrono::{Utc, TimeZone}; use htp::parse; let now = Utc.datetime_from_str("2020-12-24T23:45:00", "%Y-%m-%dT%H:%M:%S").unwrap(); let expected = Utc.datetime_from_str("2020-12-18T19:43:00", "%Y-%m-%dT%H:%M:%S").unwrap(); let datetime = parse("last friday at 19:43", now).unwrap(); assert_eq!(datetime, expected); ``` ## Similar Crate * [chrono-english](https://github.com/stevedonovan/chrono-english). ## Why? Tweak how time is parsed and interpreted inside my [rust time tracking tool](https://github.com/PicoJr/rtw). It's fun to write parsers once in while, [pest](https://github.com/pest-parser/pest) is really nice. ## What date format can it parse? see [time_clue grammar rule](src/time.pest). some examples: * `4 min ago`, `4 h ago`, `1 week ago`, `in 2 hours`, `in 1 month` * `last friday at 19`, `monday at 6 am` * `7`, `7am`, `7pm`, `7:30`, `19:43:00` * `now`, `yesterday`, `today`, `friday` * `2020-12-25T19:43:00` It also supports _interestingly-spaced_ inputs such as: ``` 4 min ago ``` It is possible to try `HTP` out using `cargo run --example time_parser`: example ``` cargo run --example time_parser last friday at 6 ``` output ``` 2020-07-03T06:00:00+02:00 ``` Thanks to pest it also provides meaningful errors: example ``` cargo run --example time_parser last friday at ``` output ``` --> 1:15 | 1 | last friday at | ^--- | = expected hms ``` ## Changelog Please see the [CHANGELOG](CHANGELOG.md) for a release history.