#date-time #relative #chrono #calendar #minutes #deltatime

relativedelta

Rust 实现了 Python 的 dateutil 库中已知的 relativedelta。chrono 库中 Duration 的扩展,用于处理相对日期。

2 个版本

0.2.2 2020 年 8 月 27 日
0.2.1 2020 年 8 月 22 日
0.2.0 2020 年 8 月 21 日
0.1.0 2020 年 8 月 20 日

#231日期和时间

每月 28 次下载

MPL-2.0+

48KB
875

relativedelta

Travis Status License crates.io codecov.io

Rust 实现了 Python 的 dateutil 库中的 relativedelta。它是 time 库中 Duration 的扩展,允许基于日期和时间的相对表示来计算日期时间。

用法

将以下内容放入你的 Cargo.toml

[dependencies]
relativedelta = "0.2"

可选功能

  • serde1:通过 serde 启用序列化/反序列化。

进行中

  • 连接到 travis.com
  • 当用浮点数初始化或用浮点数乘法时,缓解月份舍入错误。
  • 创建合适的 crate 并在 crates.io 上发布。
  • 文档和 doctest。
  • 代码覆盖率设置和带有 travis.comcodecov.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