# [dateparser](https://crates.io/crates/dateparser) [![Build Status][actions-badge]][actions-url] [![MIT licensed][mit-badge]][mit-url] [![Crates.io][cratesio-badge]][cratesio-url] [![Doc.rs][docrs-badge]][docrs-url] [actions-badge]: https://github.com/waltzofpearls/dateparser/workflows/ci/badge.svg [actions-url]: https://github.com/waltzofpearls/dateparser/actions?query=workflow%3Aci+branch%3Amain [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg [mit-url]: https://github.com/waltzofpearls/dateparser/blob/main/LICENSE [cratesio-badge]: https://img.shields.io/crates/v/dateparser.svg [cratesio-url]: https://crates.io/crates/dateparser [docrs-badge]: https://docs.rs/dateparser/badge.svg [docrs-url]: https://docs.rs/crate/dateparser/ A rust library for parsing date strings in commonly used formats. Parsed date will be returned as `chrono`'s `DateTime`. ## Examples Add to your `Cargo.toml`: ```toml [dependencies] dateparser = "0.2.1" ``` And then use `dateparser` in your code: ```rust use dateparser::parse; use std::error::Error; fn main() -> Result<(), Box> { let parsed = parse("6:15pm")?; println!("{:#?}", parsed); Ok(()) } ``` Or use `str`'s `parse` method: ```rust use dateparser::DateTimeUtc; use std::error::Error; fn main() -> Result<(), Box> { let parsed = "2021-05-14 18:51 PDT".parse::()?.0; println!("{:#?}", parsed); Ok(()) } ``` Convert returned `DateTime` to pacific time zone datetime with `chrono-tz`: ```toml [dependencies] chrono-tz = "0.6.3" dateparser = "0.2.1" ``` ```rust use chrono_tz::US::Pacific; use dateparser::DateTimeUtc; use std::error::Error; fn main() -> Result<(), Box> { let parsed = "Wed, 02 Jun 2021 06:31:39 GMT".parse::()?.0; println!("{:#?}", parsed.with_timezone(&Pacific)); Ok(()) } ``` Parse using a custom timezone offset for a datetime string that doesn't come with a specific timezone: ```rust use dateparser::parse_with_timezone; use chrono::offset::{Local, Utc}; use chrono_tz::US::Pacific; use std::error::Error; fn main() -> Result<(), Box> { let parsed_in_local = parse_with_timezone("6:15pm", &Local)?; println!("{:#?}", parsed_in_local); let parsed_in_utc = parse_with_timezone("6:15pm", &Utc)?; println!("{:#?}", parsed_in_utc); let parsed_in_pacific = parse_with_timezone("6:15pm", &Pacific)?; println!("{:#?}", parsed_in_pacific); Ok(()) } ``` Parse with a custom timezone offset and default time when those are not given in datetime string. By default, `parse` and `parse_with_timezone` uses `Utc::now().time()` as `default_time`. ```rust use dateparser::parse_with; use chrono::{ offset::{Local, Utc}, naive::NaiveTime, }; use std::error::Error; fn main() -> Result<(), Box> { let parsed_in_local = parse_with("2021-10-09", &Local, NaiveTime::from_hms(0, 0, 0))?; println!("{:#?}", parsed_in_local); let parsed_in_utc = parse_with("2021-10-09", &Utc, NaiveTime::from_hms(0, 0, 0))?; println!("{:#?}", parsed_in_utc); Ok(()) } ``` ## Accepted date formats ```rust // unix timestamp "1511648546", "1620021848429", "1620024872717915000", // rfc3339 "2021-05-01T01:17:02.604456Z", "2017-11-25T22:34:50Z", // rfc2822 "Wed, 02 Jun 2021 06:31:39 GMT", // postgres timestamp yyyy-mm-dd hh:mm:ss z "2019-11-29 08:08-08", "2019-11-29 08:08:05-08", "2021-05-02 23:31:36.0741-07", "2021-05-02 23:31:39.12689-07", "2019-11-29 08:15:47.624504-08", "2017-07-19 03:21:51+00:00", // yyyy-mm-dd hh:mm:ss "2014-04-26 05:24:37 PM", "2021-04-30 21:14", "2021-04-30 21:14:10", "2021-04-30 21:14:10.052282", "2014-04-26 17:24:37.123", "2014-04-26 17:24:37.3186369", "2012-08-03 18:31:59.257000000", // yyyy-mm-dd hh:mm:ss z "2017-11-25 13:31:15 PST", "2017-11-25 13:31 PST", "2014-12-16 06:20:00 UTC", "2014-12-16 06:20:00 GMT", "2014-04-26 13:13:43 +0800", "2014-04-26 13:13:44 +09:00", "2012-08-03 18:31:59.257000000 +0000", "2015-09-30 18:48:56.35272715 UTC", // yyyy-mm-dd "2021-02-21", // yyyy-mm-dd z "2021-02-21 PST", "2021-02-21 UTC", "2020-07-20+08:00", // hh:mm:ss "01:06:06", "4:00pm", "6:00 AM", // hh:mm:ss z "01:06:06 PST", "4:00pm PST", "6:00 AM PST", "6:00pm UTC", // Mon dd hh:mm:ss "May 6 at 9:24 PM", "May 27 02:45:27", // Mon dd, yyyy, hh:mm:ss "May 8, 2009 5:57:51 PM", "September 17, 2012 10:09am", "September 17, 2012, 10:10:09", // Mon dd, yyyy hh:mm:ss z "May 02, 2021 15:51:31 UTC", "May 02, 2021 15:51 UTC", "May 26, 2021, 12:49 AM PDT", "September 17, 2012 at 10:09am PST", // yyyy-mon-dd "2021-Feb-21", // Mon dd, yyyy "May 25, 2021", "oct 7, 1970", "oct 7, 70", "oct. 7, 1970", "oct. 7, 70", "October 7, 1970", // dd Mon yyyy hh:mm:ss "12 Feb 2006, 19:17", "12 Feb 2006 19:17", "14 May 2019 19:11:40.164", // dd Mon yyyy "7 oct 70", "7 oct 1970", "03 February 2013", "1 July 2013", // mm/dd/yyyy hh:mm:ss "4/8/2014 22:05", "04/08/2014 22:05", "4/8/14 22:05", "04/2/2014 03:00:51", "8/8/1965 12:00:00 AM", "8/8/1965 01:00:01 PM", "8/8/1965 01:00 PM", "8/8/1965 1:00 PM", "8/8/1965 12:00 AM", "4/02/2014 03:00:51", "03/19/2012 10:11:59", "03/19/2012 10:11:59.3186369", // mm/dd/yyyy "3/31/2014", "03/31/2014", "08/21/71", "8/1/71", // yyyy/mm/dd hh:mm:ss "2014/4/8 22:05", "2014/04/08 22:05", "2014/04/2 03:00:51", "2014/4/02 03:00:51", "2012/03/19 10:11:59", "2012/03/19 10:11:59.3186369", // yyyy/mm/dd "2014/3/31", "2014/03/31", // mm.dd.yyyy "3.31.2014", "03.31.2014", "08.21.71", // yyyy.mm.dd "2014.03.30", "2014.03", // yymmdd hh:mm:ss mysql log "171113 14:14:20", // chinese yyyy mm dd hh mm ss "2014年04月08日11时25分18秒", // chinese yyyy mm dd "2014年04月08日", ```