7 个版本

0.2.1 2024 年 4 月 10 日
0.2.0 2019 年 9 月 24 日
0.1.0 2019 年 1 月 3 日
0.0.4 2017 年 10 月 11 日
0.0.3 2017 年 8 月 10 日

#48日期和时间

GPL-3.0 许可证

72KB
946

Timespan Library for Rust 🦀

Build Status Coverage Status crates.io Docs.rs Homepage GitHub PRs Welcome
chrono 时间的时间跨度简单实现


使用方法

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

[dependencies]
timespan = "^0"

或者,如果您需要 Serde 支持,可以按照以下方式包含它

[dependencies]
timespan = { version = "^0", features = ["with-serde"] }

概述

日期和时间跨度

Timespan 可以用来创建由 chrono::DateTime 组成的时区感知跨度。

目前,DateTimeSpan 支持 chrono::Utcchrono::Localchrono::FixedOffset 时区的序列化和反序列化。对于其他时区类型的支持,请参阅文档

with-serde 功能启用时,DateTimeSpan 支持使用 serde 进行序列化和反序列化。

use timespan::DateTimeSpan;
use chrono::Utc;

let a: DateTimeSpan<Utc> = "2017-01-01T15:10:00 +0200 - 2017-01-02T09:30:00 +0200"
   .parse().unwrap();

assert!(
    format!("{}", a.format("{start} to {end}", "%c", "%c")) ==
    "Sun Jan  1 13:10:00 2017 to Mon Jan  2 07:30:00 2017"
);

单个日期跨度

可以使用 DateSpan 创建由 chrono::Date 组成的时区感知跨度。

目前,DateSpan 不支持从字符串进行序列化和反序列化。

use timespan::DateSpan;
use chrono_tz::Europe::Paris;

let a = DateSpan::from_utc_datespan(
    &"1789-06-17 - 1799-11-10".parse().unwrap(),
    &Paris,
);

let f = a.format(
    "The french revolution lasted from the {start} to the {end}.",
    "%eth of %B %Y",
    "%eth of %B %Y",
);
assert!(
    format!("{}", f) ==
    "The french revolution lasted from the 17th of June 1789 to the 10th of November 1799."
);

天真日期和时间跨度

NaiveDateSpanNaiveTimeSpanNaiveDateTimeSpan 都不具备时区感知,可以用于简单的时间跨度。

所有天真跨度都完全支持从字符串进行序列化和反序列化。

with-serde 功能启用时,所有天真跨度都支持使用 serde 进行序列化和反序列化。

use timespan::NaiveDateSpan;

let a: NaiveDateSpan = "2017-04-15 - 2017-08-15".parse().unwrap();
let b = NaiveDateSpan::parse_from_str(
    "15.04.17 - 15.08.17",
    "{start} - {end}",
    "%d.%m.%y", "%d.%m.%y"
).unwrap();

let f = a.format("from {start} to {end}", "%m/%d", "%m/%d");
assert!(format!("{}", f) == "from 04/15 to 08/15");
assert!(a == b);
use timespan::NaiveTimeSpan;

let a: NaiveTimeSpan = "17:30:00 - 19:15:00".parse().unwrap();
let b = NaiveTimeSpan::parse_from_str(
    "05.30 PM - 07.15 PM",
    "{start} - {end}",
    "%I.%M %P", "%I.%M %P"
).unwrap();

let f = a.format("from {start} to {end}", "%R", "%R");
assert!(format!("{}", f) == "from 17:30 to 19:15");
assert!(a == b);
use timespan::NaiveDateTimeSpan;

let a: NaiveDateTimeSpan = "2017-02-20T11:30:00 - 2017-02-23T18:00:00".parse().unwrap();
let b = NaiveDateTimeSpan::parse_from_str(
    "02/20/17 11.30 am - 02/23/17 06.00 pm",
    "{start} - {end}",
    "%D %I.%M %p", "%D %I.%M %p"
).unwrap();

let f = a.format("from {start} to {end}", "%R on %A", "%R on %A");
assert!(format!("{}", f) == "from 11:30 on Monday to 18:00 on Thursday");
assert!(a == b);

如何运行示例

为了从 example 文件夹中运行一个示例,请执行以下命令。

$ cargo run --example <name>

convert 示例

10.30 到 14.00 转换为 10:30 - 14:00

$ cargo run --example convert -- "from 10.30 to 14.00" \
    "from {start} to {end}" "%H.%M" "%H.%M" \
    "{start} - {end}" "%R" "%R"

duration 示例

获取时间跨度的持续时间 10.30 到 14.00

$ cargo run --example duration -- "from 10.30 to 14.00" \
    "from {start} to {end}" "%H.%M" "%H.%M"

contains 示例

获取 11.20 是否包含在时间跨度 10.30 到 14.00

$ cargo run --example contains -- "from 10.30 to 14.00" "11.20" \
    "from {start} to {end}" "%H.%M" "%H.%M" "%H.%M"

许可证

本项目采用 GPL-v3 许可证 - 详细信息请见 LICENSE 文件。

依赖

约 3–4.5MB
约 75K SLoC