#duration #time #float #simulation

float_duration

浮点时长支持。提供时间跨度的量化。与标准 std::time 或 chrono crate 不同,此 crate 的目标是提供一个功能齐全的 Duration 类型,该类型公开并使用浮点值而不是整数。

6 个版本

使用旧的 Rust 2015

0.3.3 2017年6月22日
0.3.2 2017年5月28日
0.2.0 2017年5月26日
0.1.0 2017年5月25日

日期和时间 中排名 285

每月下载 41
用于 2 个 Crates

MIT 许可证

54KB
831

float_duration 0.3.3

Build Status float_duration on docs.rs float_duration on crates.io

使用浮点量进行时间量化。

此 crate 提供时间跨度的量化。与标准 std::time 或 chrono crate 不同,此 crate 的目标是提供一个功能齐全的 Duration 类型,该类型公开并使用浮点值而不是整数。

现有的时间跨度解决方案具有高精度,适用于显示和存储时间值,但在需要某些单位中单个分数值用于模拟或数学环境时不太方便。因此,开发此 crate 以满足这一需求,同时最大程度地兼容现有的时间库,而不重造轮子。该接口旨在与这些库非常相似,只是使用浮点值,因此可以作为现有程序的近似直接替换,这些程序将受益于浮点时长。

目标是提供一个类型,其功能和灵活性类似于 C++ 中的 std::chrono::duration,同时在设计上保持“Rusty”风格。

用法

将此内容放入您的 Cargo.toml

[dependencies]
float_duration = "0.3.3

概述

此 crate 提供了一个主要类型:FloatDuration,它表示一个任意的时间距离,没有定义的起点或终点。内部,它存储一个表示跨度的秒数的单个 f64,对于“向后”跨度可以是负数。它提供了创建和读取各种单位的访问器方法,以及许多 std::ops 中算术运算符的 impl

let timespan = FloatDuration::hours(2.5) + FloatDuration::seconds(30.0);
assert_eq!(timespan, FloatDuration::seconds(9030.0));
assert_eq!(timespan, FloatDuration::minutes(150.5));

此外,还提供了一个 TimePoint 特征,用于计算表示时间点的两个对象之间的 FloatDuration

示例用法

计算较大时间间隔中的块数

use float_duration::FloatDuration;

let time_block = FloatDuration::minutes(5.0);
let blocks_per_hour = FloatDuration::hours(1.0) / time_block;

assert_eq!(blocks_per_hour, 12.0);

对一个弹簧上的质量进行基本的数值积分

use float_duration::FloatDuration;

fn acceleration(m: f64, x: f64, t: FloatDuration) -> f64 {
    0.5*m*x*x
}

fn main() {
    let mut sim_time = FloatDuration::zero();
    let end_time = FloatDuration::minutes(2.0);
    let dt = FloatDuration::milliseconds(50.0);

    let mut x = 2.0;
    let mut v = 0.0;
    let m = 1.0;

    while sim_time < end_time {
        let acc = acceleration(m, x, sim_time);
        v += acc*dt.as_seconds();
        x += v*dt.as_seconds();
        sim_time += dt;
    }
}

在100个等间隔的时段上运行一个函数

use float_duration::{FloatDuration, subdivide};

fn compute_value(t: FloatDuration) -> f64 {
    t.as_seconds()*t.as_seconds()
}

for time in subdivide(FloatDuration::zero(), FloatDuration::hours(1.0), 100) {
    println!("{}", compute_value(time));
}

库支持

目前,float_duration可以编译而不依赖任何库,但它提供了与其他库接口的可选功能。

std::time

std::time模块受到支持,并且可以直接使用FloatDurationSystemTimeInstant

// TimePoint needed for `float_duration_since`.
use float_duration::{FloatDuration, TimePoint};
use std::time::{Instant, SystemTime};


let start_time = Instant::now();
//Do lengthy operation...
let end_time = Instant::now();

println!("Took {}.", end_time.float_duration_since(start_time).unwrap());

FloatDuration还可以通过to_stdfrom_std方法转换为/从std::time::Duration转换。

approx

如果启用了approx功能,FloatDuration提供了一种实现approx::ApproxEq的方法,用于对FloatDuration进行近似相等比较。由于FloatDuration使用浮点值,这应该是建立两个持续时间对象之间相等性的首选方式。

chrono

类似于std::time,如果启用了“chrono”功能,则可以通过TimePoint trait实现来支持计算相同类型日期或时间对象之间的FloatDuration。此外,可以通过to_chronofrom_chrono方法将FloatDuration对象转换为/从chrono::Duration对象。

注意:如果启用了chrono功能,则必须也启用time功能,因为chrono直接依赖于在time中定义的一些类型。

use chrono::{UTC, TimeZone};
use float_duration::{TimePoint, FloatDuration};

let date1 = UTC.ymd(2017, 5, 25).and_hms(10, 0, 0);
let date2 = UTC.ymd(2017, 5, 26).and_hms(12, 0, 0);

assert_eq!(date2.float_duration_since(date1).unwrap(), FloatDuration::days(1.0) +
    FloatDuration::hours(2.0));

serde

FloatDuration支持与serde进行序列化。目前,FloatDuration被序列化为一个代表持续时间中秒数的单个f64值。

依赖项

~1.7–2.5MB
~41K SLoC