#日期和时间 #英语 #chrono #模式 # #下一个 #

chrono-english

解析简单的英语日期,受 Linux date 命令启发

8 个版本

使用旧的 Rust 2015

0.1.7 2021年12月9日
0.1.6 2021年3月30日
0.1.4 2018年11月4日
0.1.3 2018年9月15日
0.1.1 2018年3月24日

98日期和时间

Download history 3025/week @ 2024-03-13 4312/week @ 2024-03-20 3407/week @ 2024-03-27 1538/week @ 2024-04-03 1102/week @ 2024-04-10 967/week @ 2024-04-17 1027/week @ 2024-04-24 985/week @ 2024-05-01 1006/week @ 2024-05-08 685/week @ 2024-05-15 870/week @ 2024-05-22 918/week @ 2024-05-29 813/week @ 2024-06-05 654/week @ 2024-06-12 716/week @ 2024-06-19 814/week @ 2024-06-26

3,127 每月下载量
用于 33 个 Crates (19 个直接)

MIT 许可证

45KB
996

解析英语日期

我一直很钦佩 GNU date 命令将 "英语" 表达式转换为日期和时间的功能,使用 date -d exprchrono-english 做了类似的表达,尽管有扩展,例如你可以指定日期和时间 "下周五晚上8点"。不尝试完全的自然语言解析 - 只支持有限的模式集。

支持的格式

chrono-english 支持 绝对 日期:类似 ISO 的日期 "2018-04-01" 和月份名称形式 "2018年4月1日" 和 "April 1, 2018"。 (没有歧义,所以这两种形式都可以)

还支持非正式的 "01/04/18" 或美国形式 "04/01/18"。有一个 Dialect 枚举来指定你想使用的日期英语类型。此形式接受短年和长年;短日期在 1940 和 2040 之间。

然后是像 'April 1' 和 '9/11' 这样的 相对 日期(使用 Dialect::Us)。假设当前年份,但可以通过 'next' 和 'last' 进行修改。例如,现在是 2018 年 3 月 13 日:"April 1" 和 "next April 1" 在 2018 年;"last April 1" 在 2017 年。

另一种相对形式是一个简单的月份名称,如 'apr' 或 'April'(不区分大小写,只有前三个字母是重要的),其中日期被假设为 1 日。

工作日也以相同的方式工作:"friday" 意味着相对于今天的这个周五。 "last Friday" 是明确的,但 "next Friday" 的含义不同;在美国它意味着与 "Friday" 相同,但其他情况下它意味着下周的周五(加 7 天)。

日期和时间还可以通过多个时间单位指定。所以 "2 天","3 小时"。同样,前三个字母,但 'd'、'm' 和 'y' 是可理解的(所以 "3h")。我们区分 间隔(秒、分钟、小时), 间隔(天、周)和 间隔(月、年)。

秒间隔后面不跟时间,但天和月间隔可以。如果没有时间,则天间隔与基准时间相同(默认为 'now')

月份间隔始终给出相同的日期,如果可能的话。但是,在“30 Jan”中添加一个月将会得到“28 Feb”或“29 Feb”,具体取决于是否是闰年。

最后,日期后可以跟时间。可以是“正式”的,如18:03,可选秒(如18:03:40),或者是“非正式”的,如6.03pm。因此,可以得到“下周五晚上8点”等。

API

存在一个精确的入口点,给定日期字符串,一个DateTime,它是相对日期和时间的操作基础,以及一个方言(目前是Dialect::UkDialect::Us)。基础时间还指定了所需的时区。

extern crate chrono_english;
use chrono_english::{parse_date_string,Dialect};

extern crate chrono;
use chrono::prelude::*;

let date_time = parse_date_string("next friday 8pm", Local::now(), Dialect::Uk)?;
println!("{}",date_time.format("%c"));

examples中有一个小的命令行程序parse-date,可以用来玩这些表达式。

$ alias p='cargo run --quiet --example parse-date --'
$ p 'next April'
base Wed Mar 14 20:10:37 2018 +0200
calc Sun Apr  1 00:00:00 2018 +0200
$ p '20/03/18 12:04'
base Wed Mar 14 20:12:44 2018 +0200
calc Tue Mar 20 12:04:00 2018 +0200
$ p '9/11/01' --american
base Wed Mar 14 20:13:08 2018 +0200
calc Tue Sep 11 00:00:00 2001 +0200
$ p 'next fri 8pm' '2018-03-14'
base Wed Mar 14 00:00:00 2018 +0200
calc Fri Mar 16 20:00:00 2018 +0200

依赖项

~1MB
~19K SLoC