2 个版本
0.2.2 | 2020 年 8 月 27 日 |
---|---|
0.2.1 | 2020 年 8 月 22 日 |
0.2.0 |
|
0.1.0 |
|
#231 在 日期和时间 中
每月 28 次下载
48KB
875 行
relativedelta
Rust 实现了 Python 的 dateutil 库中的 relativedelta。它是 time 库中 Duration
的扩展,允许基于日期和时间的相对表示来计算日期时间。
用法
将以下内容放入你的 Cargo.toml
[dependencies]
relativedelta = "0.2"
可选功能
serde1
:通过 serde 启用序列化/反序列化。
进行中
- 连接到 travis.com。
- 当用浮点数初始化或用浮点数乘法时,缓解月份舍入错误。
- 创建合适的 crate 并在 crates.io 上发布。
- 文档和 doctest。
- 代码覆盖率设置和带有 travis.com 和 codecov.io 的徽章。
概述
RelativeDelta
数据类型同时持有年、月、日、时、分、秒和纳秒的相对和绝对值。
通过以 "s" 结尾的方法(例如 ::with_years
,.and_days
)来操作和访问相对部分。没有 "s" 的绝对值。
所有相对值表示日期和时间的偏移量,因此可以是正数也可以是负数,并且可以在其数据类型限制内取任何值。在创建时,Builder
将尝试聚合值,例如,如果小时不在 [-23;23] 的范围内,数据类型将更新为而不是添加或减去额外的天数,只保留余数作为小时。所有偏移量默认设置为零。
绝对值表示明确的年、月、日等。因此,如果某人总是寻找一个月中的某一天,他们就会使用 ::with_month
或 .and_month
方法。所有绝对值都是选项,默认设置为 None
。
RelativeDelta
也包含一个星期几的值,这是一个包含 (Weekday, nth)
元组的选项。这允许某人例如,询问从今天起一年的第二个星期二,使用 Utc::now() + RelativeDelta::with_years(1).and_weekday(Some(Weekday::Tue, 2)).new()
。
示例
// Construction
let years1 = RelativeDelta::with_years(1).new();
let months12 = RelativeDelta::with_months(12).new();
assert_eq!(years1, months12);
let years1 = RelativeDelta::with_years(1).and_days(32).new();
// If same parameter is specified twice, only the latest is applied.
let months6 = RelativeDelta::with_months(12).with_months(6).new();
assert_eq!(months6, RelativeDelta::with_months(6).new());
// Below is identical to: RelativeDelta::yysmmsdds(Some(2020), 1, Some(1), 3, None, 12).new();
let rddt = RelativeDelta::with_year(2020).and_years(1).and_month(Some(1)).and_months(3).and_days(12).new();
// Two or more RelativeDeltas can be added and substracted. However, note that constants are lost in the process.
let lhs = RelativeDelta::yysmmsdds(Some(2020), -4, Some(1), 3, None, 0).new();
let rhs = RelativeDelta::yysmmsdds(Some(2020), 1, Some(1), 42, None, 0).new();
assert_eq!(lhs + rhs, RelativeDelta::with_years(-3).and_months(45).new());
assert_eq!(lhs - rhs, RelativeDelta::with_years(-5).and_months(-39).new());
assert_eq!(-lhs + rhs, RelativeDelta::with_years(5).and_months(39).new());
// The RelativeDelta can be multiplied with a f64.
assert_eq!(rhs * 0.5, RelativeDelta::with_years(2).and_year(Some(2020)).and_months(3).and_month(Some(1)).new());
// This crates party piece is the ability to calculate dates based on already existing chrono::DateTime
// If one would like to get the last day of the month that one is currently in, it could be done with:
println!("{}", Utc::now() + RelativeDelta::with_day(1).and_months(1).and_days(-1).new());
// Above first sets the day of the month to the 1st, then adds a month and subtracts a day.
// One could also request the first monday after one year by
let first_monday_after_one_year = RelativeDelta::with_years(1).and_weekday(Some((Weekday::Mon, 1))).new();
let d = Utc.ymd(2020, 1, 1).and_hms(0,0,0) + first_monday_after_one_year;
assert_eq!(d, Utc.ymd(2021, 1, 4).and_hms(0,0,0));
依赖项
~1–1.5MB
~24K SLoC