5 releases

0.2.0 Jun 5, 2024
0.1.3 Feb 18, 2024
0.1.2 Feb 15, 2024
0.1.1 Feb 13, 2024
0.1.0 Jan 22, 2024

#130 in Date and time

Download history 43/week @ 2024-02-19 16/week @ 2024-02-26 1/week @ 2024-03-04 9/week @ 2024-03-11 27/week @ 2024-04-01 149/week @ 2024-06-03

149 downloads per month

MIT license

34KB
922 lines

Langtime - Parsing dates in rust

This library is a personal project that allows rust programmers to parse dates written in the english language, both absolute and relative. These are some examples of dates that you can currently parse:

  • 2024-01-01 at 20:15
  • 28/02/2024 at 10 a.m.
  • 25 minutes ago

Why creating this repo when chrono-english already exists? Well for two reasons. First of all, I didn't knew it existed. Second, there are some formats, or combination thereof, that are not parsable with chrono_english.

This library uses nom, which makes it extremely easy to add new formats to the parsable inputs.

How to use it

The most basic use of this library looks like this:

fn main() {
    match langtime::parse("12/05/2024 at 8pm") {
        Ok(datetime) => println!("{:?}", datetime),
        Err(_) => println!("Cannot parse input as a date")
    };
}

By default, the parse function will discard any input that is found beyond the datetime string. For example, this code would also correctly match a string such as "12/05/2024 is the date", even though "is the date" is not recognized as a time or date format.

There are some options that you can pass through a configuration struct. The first one is the english dialect (US or UK). This is currently only used to discern whether the date format for the language is "dd/mm/yyyy" or "mm/dd/yyyy". Then, you can also force the library to check that the full string is parsable as a date, so that the text "12/05/2024 is the date" will not be considered correct anymore, and will result in an error.

Here is how you can do it:

use langtime::{parse_with_config, ParseConfig, Dialect};

fn main() {
    let config = ParseConfig {
        dialect: Dialect::US,
        full_string_match: true
    };
    
    match parse_with_config("05/23/2024 at 9pm", &config) {
        Ok(datetime) => println!("{:?}", datetime),
        Err(_) => println!("Cannot parse input as a date")
    }
}

Next goals

  • Expand allowed tokens to separate parts of sentences
  • Correct month and year calculation
  • Implement unit tests
  • Add missing time format
  • Cleanup text before parsing
  • Add configuration for english dialects (UK/US)
  • Add configuration to force matching to the full string

Parsable data

Dates

  • 2024-01-20 (ISO)
  • 20/01/2024
  • yesterday / tomorrow
  • 01/2024 (beginning of the month)
  • january 2024 (same as above)

Times

  • 17:00
  • 17:00:30
  • 5 p.m. / 5pm
  • 8 o'clock / half past 9 / a quarter to 10

Relative times and dates

  • in 5 hours
  • 8 minutes ago
  • 2 hours, 8 minutes and 10 seconds ago
  • last friday
  • next tuesday
  • saturday / this saturday
  • 2 days ago
  • in 3 months

Full dates and times

  • 2024-01-01T20:30:10
  • yesterday at 17:00
  • tomorrow at 8 p.m.
  • 2 days ago at 5 a.m.
  • last friday at 9:00

Dependencies

~2.5MB
~38K SLoC