时间
Rust标准库只对时间进行了非常有限的支持。所以想要处理时间一般都借助第三方库time-rs 和 chrono。
Rust 标准库主要将时间抽象成两种类型,分别是 Instant
(代表时刻)和 Duration
(代表时间跨度)。自然的,我们有
Instant - Instant = Duration
Instant +/- Duration = Instant
Instant::now()
可以获得系统时间。但是由于Rust std想要更好的cross-platform并且又不愿意过度封装,所以我们不能从Instant
直接获取UTC timestamp,如果不想借助第三方库的帮助,可以这样获得timestamp
#![allow(unused)]
use std::time::SystemTime;
fn main() {
match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()),
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
}
}
不过想要进行复杂的时间处理,还是建议使用第三方库。这里简单介绍time-rs。结构化时间的数据结构是 time::OffsetDateTime
。
- 获得
OffsetDateTime
,时区为GMT/UTC:OffsetDateTime::now_utc()
- 获得
OffsetDateTime
,时区为本地时区:OffsetDateTime::now_local()
库自然也提供了不同类型相互转化的辅助函数。格式化字符串参考文档。
From | To | Function |
---|---|---|
timestamp |
Local OffsetDateTime |
- |
timestamp |
UTC OffsetDateTime |
OffsetDateTime::from_unix_timestamp() /OffsetDateTime::from_unix_timestamp_nanos |
OffsetDateTime |
timestamp |
.unix_timestamp() /.unix_timestamp_nanos |
struct_time |
string | .format() |
string | struct_time |
OffsetDateTime::parse() |
另外,关于这个OffsetDateTime
不得不提的两个小tips:
- 它是一个不透明的类,想要访问具体的年/月/日等信息需要通过方法访问/修改。
- 库提供了很多方便的宏来构造类型,例如通过这个宏来构造
OffsetDateTime
:datetime!(2020-01-02 03:04:05 +06:07:08)
这里联系一下Python的内容,设计是基本一致的:
time::OffsetDateTime
=datetime.datetime
time::UtcOffset
=datetime.timezone
time::Duration
=datetime.timedelta
甚至两个库都单独分别封装了
date
/time
,这里没有介绍。