Parse dates in commonly used string formats with Rust.
This repo contains 2 cargo workspaces:
- dateparser: Rust crate for parsing date strings in commonly used formats.
- belt: Command-line tool that can display a given time in a list of selected time zones. It also serves as an example showcasing how you could use dateparser in your project.
dateparser
crate
use dateparser::parse;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let parsed = parse("6:15pm")?;
println!("{:#?}", parsed);
Ok(())
}
Will parse the input 6:15pm
and print parsed date and time in UTC time zone as 2023-03-26T01:15:00Z
.
More about this crate on Docs.rs and in examples folder
// 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日",
belt
CLI tool
Run belt
to parse a given date:
$> belt 'MAY 12, 2021 16:44 UTC'
+-------------------+---------------------------+
| Zone | Date & Time |
+===================+===========================+
| Local | 2021-05-12 09:44:00 -0700 |
| | 1620837840 |
+-------------------+---------------------------+
| UTC | 2021-05-12 16:44:00 +0000 |
| | 2021-05-12 16:44 UTC |
+-------------------+---------------------------+
| America/Vancouver | 2021-05-12 09:44:00 -0700 |
| | 2021-05-12 09:44 PDT |
+-------------------+---------------------------+
| America/New_York | 2021-05-12 12:44:00 -0400 |
| | 2021-05-12 12:44 EDT |
+-------------------+---------------------------+
| Europe/London | 2021-05-12 17:44:00 +0100 |
| | 2021-05-12 17:44 BST |
+-------------------+---------------------------+
MacOS Homebrew or Linuxbrew:
brew tap waltzofpearls/belt
brew install belt
List files that need to be updated with new version number:
make show-version-files
It will output something like this:
./dateparser/Cargo.toml:3:version = "0.1.5"
./dateparser/README.md:26:dateparser = "0.1.5"
./dateparser/README.md:60:dateparser = "0.1.5"
./belt/Cargo.toml:3:version = "0.1.5"
Next, automatically bump the version with make bump-version
or manually update verion numbers in
those listed files. When auto incrementing version with make bump-version
, it will only bump the
patch version, for example, 0.1.5 will become 0.1.6. Automatic version bump will create a git branch,
commit and push the changes. You will need to create a pull request from GitHub to merge those changes
from the git branch that's automatically created.
NOTE: if those files with version numbers are manually edited, then you will need to run cargo update
to update dateparser
and belt
versions in the Cargo.lock
file, and then git commit and push those
changes to a git branch, and create a pull request from that branch.
Once the pull request is merged and those files are updated, run the following command to tag a new version with git and push the new tag to GitHub. This will trigger a build and release workflow run in GitHub Actions:
make release