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
54KB
831 行
float_duration 0.3.3
使用浮点量进行时间量化。
此 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
模块受到支持,并且可以直接使用FloatDuration
与SystemTime
和Instant
// 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_std
和from_std
方法转换为/从std::time::Duration
转换。
approx
如果启用了approx
功能,FloatDuration
提供了一种实现approx::ApproxEq
的方法,用于对FloatDuration
进行近似相等比较。由于FloatDuration
使用浮点值,这应该是建立两个持续时间对象之间相等性的首选方式。
chrono
类似于std::time
,如果启用了“chrono”功能,则可以通过TimePoint
trait实现来支持计算相同类型日期或时间对象之间的FloatDuration
。此外,可以通过to_chrono
和from_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