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 在 日期和时间 中
3,127 每月下载量
用于 33 个 Crates (19 个直接)
45KB
996 行
解析英语日期
我一直很钦佩 GNU date
命令将 "英语" 表达式转换为日期和时间的功能,使用 date -d expr
。 chrono-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::Uk
或Dialect::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