如何将Unix时间/自纪元以来的时间转换为标准日期和时间?

22

我正在使用 Chrono 库;经过一番探索,我发现 DateTime 类型有一个函数 timestamp() 可以生成类型为 i64 的 Unix 时间戳。但是,我不知道如何将其转换回 DateTime

extern crate chrono;
use chrono::*;

fn main() {
    let date = chrono::UTC.ymd(2020, 1, 1).and_hms(0, 0, 0);
    println!("{}", start_date.timestamp());
    // ...how to convert it back?
}
3个回答

17

首先需要创建一个 NaiveDateTime,然后再使用它来创建一个 DateTime

extern crate chrono;
use chrono::prelude::*;

fn main() {
    let datetime = Utc.ymd(2020, 1, 1).and_hms(0, 0, 0);
    let timestamp = datetime.timestamp();
    let naive_datetime = NaiveDateTime::from_timestamp(timestamp, 0);
    let datetime_again: DateTime<Utc> = DateTime::from_utc(naive_datetime, Utc);

    println!("{}", datetime_again);
}

Playground


2
我在thisplace找到了类似的用法,但显然你的答案更简洁友好。谢谢! - Sajuuk
2021 年答案在底部:https://dev59.com/WFgQ5IYBdhLWcg3wkEtJ#70058251 - Aiyion.Prime
Utc.ymd已被弃用:https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html#method.ymd - undefined

4

不确定我是否遗漏了什么,或者时间过去后chrono扩展了其功能集,但至少自chrono 0.4.0以来,似乎有一种更清洁的方法来实现:

https://docs.rs/chrono/0.4.19/chrono/#conversion-from-and-to-epoch-timestamps

use chrono::{DateTime, TimeZone, Utc};

// Construct a datetime from epoch:
let dt = Utc.timestamp(1_500_000_000, 0);
assert_eq!(dt.to_rfc2822(), "Fri, 14 Jul 2017 02:40:00 +0000");

// Get epoch value from a datetime:
let dt = DateTime::parse_from_rfc2822("Fri, 14 Jul 2017 02:40:00 +0000").unwrap();
assert_eq!(dt.timestamp(), 1_500_000_000);

所以你的完整转换应该像这样:

extern crate chrono;
use chrono::*;

fn main() {
    let start_date = chrono::Utc.ymd(2020, 1, 1).and_hms(0, 0, 0);
    let ts = start_date.timestamp();
    println!("{}", &ts);
    let end_date = Utc.timestamp(ts, 0);
    assert_eq!(end_date, start_date);
}

Utc.ymd已被弃用。请参考https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html#method.ymd。 - undefined
没错,但是他的问题中也包含了一部分代码。 我会在周一查看一下,看看我要如何更新今年的答案 :) - undefined

2
您可以使用parse_duration包:https://docs.rs/parse_duration/2.1.0/parse_duration/
extern crate parse_duration;
use parse_duration::parse;
use std::time::Duration;

fn main() {
    // 1587971749 seconds since UNIX_EPOCH
    assert_eq!(parse("1587971749"), Ok(Duration::new(1587971749, 0)));

    // One hour less than a day
    assert_eq!(parse("1 day -1 hour"), Ok(Duration::new(82_800, 0)));

    // Using exponents
    assert_eq!(
        parse("1.26e-1 days"),
        Ok(Duration::new(10_886, 400_000_000))
    );

    // Extra things will be ignored
    assert_eq!(
        parse("Duration: 1 hour, 15 minutes and 29 seconds"),
        Ok(Duration::new(4529, 0))
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接