[](https://crates.io/crates/htp)
[](https://docs.rs/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
|
|
= expected hms
```
## Changelog
Please see the [CHANGELOG](CHANGELOG.md) for a release history.