字段tv_sec在结构SystemTime中不存在

时间:2019-04-25 12:27:18

标签: rust

我正在尝试获取上次修改文件的时间,但出现字段未找到的错误。

use std::{fs, io, time};

fn main() -> io::Result<()> {
    let metadata = fs::metadata("foo.txt")?;
    let _time: time::SystemTime = metadata.modified().unwrap();
    let last_modified = _time.tv_sec;

    println!("{:?}", last_modified);
    Ok(())
}
error[E0609]: no field `tv_sec` on type `std::time::SystemTime`
 --> src/main.rs:6:31
  |
6 |     let last_modified = _time.tv_sec;
  |                               ^^^^^^ unknown field

我还尝试了使用结果而不进行解包,但是我到达了要访问结构的tv_sec字段的位置。

作为参考,在展开之前,结果为Ok(SystemTime { tv_sec: 000, tv_nsec: 000 }),在展开之后,结果仅为SystemTime { tv_sec: 000, tv_nsec: 000 })

我对Rust还是很陌生,但是我已经整理了文档,并且从文档中看来,我应该能够像这样访问SystemTime结构的字段。

1 个答案:

答案 0 :(得分:5)

您无法访问tv_sec,因为该字段不是公开的。这称为可见性,您可以在chapter 7.2 of the book中进行了解。

您只能在API of SystemTime上的SystemTime上调用公共方法。


出现“奇怪”错误消息i的原因,尽管调试表示表明它是一个“平坦”结构(例如,它具有两个字段tv_sectv_nsec),{{3 }},这意味着您必须调用.0来获取内部字段,否则将导致错误

error[E0616]: field `0` of struct `std::time::SystemTime` is private
  --> src/main.rs:10:22
   |
10 |     println!("{:?}", time.0);
   |                      ^^^^^^

这样做是为了抽象化不同的操作系统;例如,Windows处理时间与Unix不同。


如果您想在几秒钟内获得“年龄”,则可以使用it is actually a tuple struct将其转换为Duration,这将带给您Duration的帮助,您可以在其中使用SystemTime::elapsed