将 ISO 8601 时间/持续时间“Thhmmss-hhmm/PTmm”即(“T063000-0600/PT10M”)序列化为 Rust 结构[重复]

问题描述 投票:0回答:1

我正在编写一个相当简单的 REST api,我的一个对象想要知道一天中的某个时间和要激活的持续时间。我希望我可以使用 actix-web、serde 和 chrono 将 ISO 8601 时间/持续时间序列化为 Rust 结构的数据成员,这可能吗?

我已经对 serde 序列化和 chrono 进行了一些初步研究,但除了非常基本的日期时间序列化之外,我没有发现太多其他内容。不完全是我想做的事。

rust serialization iso8601 serde
1个回答
0
投票

当然,一切皆有可能,但在这种情况下,您将必须自己进行一些提升或使用另一个板条箱,因为 chrono 的

Duration
类型不提供格式化或解析实用程序。

你可以很容易地实现时间减半。请注意,chrono 没有“带时区的时间”类型,因此我将使用

NaiveTime
并假设 UTC。

struct TimeWithDuration {
    pub time: chrono::NaiveTime,
    pub duration: chrono::Duration,
}

impl Serialize for TimeWithDuration {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_str(&format!(
            "{}/{}",
            self.time.format("T%H%M%SZ"),
            format_duration(self.duration),
        )
    }
}

fn format_duration(duration: chrono::Duration) -> impl Display {
    todo!()
}

format_duration
是一个占位符函数,应适当地格式化持续时间。您可以考虑查看 iso8601-duration crate

© www.soinside.com 2019 - 2024. All rights reserved.