跳转至

时间

Rust标准库只对时间进行了非常有限的支持。所以想要处理时间一般都借助第三方库time-rschrono

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:

  1. 它是一个不透明的类,想要访问具体的年/月/日等信息需要通过方法访问/修改。
  2. 库提供了很多方便的宏来构造类型,例如通过这个宏来构造OffsetDateTimedatetime!(2020-01-02 03:04:05 +06:07:08)

这里联系一下Python的内容,设计是基本一致的:

time::OffsetDateTime = datetime.datetime
time::UtcOffset = datetime.timezone
time::Duration = datetime.timedelta

甚至两个库都单独分别封装了date/time,这里没有介绍。