time - 如何解析自纪元以来格式为微秒的时间戳?

标签 time rust

我想解析这个字符串:1595879159050208 .这是我尝试过的。

use chrono::prelude::*;

fn main() {
    let utc: DateTime<Utc> = Utc::now();
    let format = "%s%6f";
    let string = utc.format(format).to_string();
    println!("{}", string); // 1595879159050208
    let parsed = DateTime::parse_from_str(&string, format);
    println!("{:?}", parsed); // Err(ParseError(TooShort))
}
为什么这不起作用?
Chrono 0.4
rustc 1.41.0

最佳答案

您可以在 parsing function documentation 中看到该函数在遵守内在解析宽度时是贪婪的,这意味着在“匹配”您的格式时,它将尝试从左到右消耗最多的字符,尊重最大值。由于 unix 时间戳 (%s) 没有最大字符数,您可以看到 in the source允许的最大字符数是 usize::MAX (至少为 65535)。在这个例子中,整个字符串 (1595879159050208) 被用作时间戳 Tue May 12 02:50:08 50573367 UTC (veeeeeeeery 在 future 很远),并且找不到剩余的数字 (%6f)。
我们可以通过在您的格式中添加一个空格来测试:"%s %6f" .在这种情况下,会出现一个新错误( ParseError(NotEnough) ),使用 DateTime::parse_from_str docs 可以更好地解释这一点:

Note that this method requires a timezone in the string. See NaiveDateTime::parse_from_str for a version that does not require a timezone in the to-be-parsed str.


所以使用 NaiveDateTime:
use chrono::prelude::*;

fn main() {
    let utc: DateTime<Utc> = Utc::now();
    let format = "%s %6f";
    let string = utc.format(format).to_string();
    println!("{}", string); // 1595902520 811515
    let parsed = NaiveDateTime::parse_from_str(&string, format);
    println!("{:?}", parsed); // Ok(2020-07-28T02:15:20.811515)
}
不幸的是,您想解析没有空格的原始字符串。为此,我认为您可以:
  • 使用标准库将字符串解析为 i64 为 µs,并使用 NaiveDateTime::from_timestamp
  • 从那里计算秒数/纳秒数
  • 将字符串切片并分别解析秒/微秒
  • 如果您不关心亚秒级精度,请将原始字符串的一部分传递给 parse_from_str , 只用 %s 格式化

  • 使用第二个选项:
    use chrono::prelude::*;
    
    fn main() {
        let utc: DateTime<Utc> = Utc::now();
        let format = "%s%6f";
        let string = utc.format(format).to_string();
        println!("{}", string); // 1595904294646258
    
        let secs = string[..string.len() - 6].parse();
        let microsecs = string[string.len() - 6..].parse::<u32>();
        let parsed = match (secs, microsecs) {
            (Ok(s), Ok(us)) => NaiveDateTime::from_timestamp_opt(s, us * 1000),
            _ => None,
        };
        println!("{:?}", parsed); // Some(2020-07-28T02:44:54.646258)
    }
    

    关于time - 如何解析自纪元以来格式为微秒的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63122526/

    相关文章:

    linux - Bash 检查 $var 是否在数字范围内

    time - 为什么更新时间对于像 nginx 这样的 Web 服务器如此重要?

    rust - 如何创建具有两个condvar的互斥锁?

    rust - 为什么在 BTreeSet 和 HashSet 之间切换时,Bron-Kerbosch 算法会得到不同的结果?

    rust - 如何永久关闭瓶盖

    c - 如何在 C 程序开始时开始计时

    Jquery将hmm格式转换为小时

    php - 选择时间与 future 日期相同的数据

    rust - 可转换为 isize 的枚举的特征

    rust - 为什么 Rust 元组不使用方括号访问里面的元素?