我正在编写一个相当简单的 REST api,我的一个对象想要知道一天中的某个时间和要激活的持续时间。我希望我可以使用 actix-web、serde 和 chrono 将 ISO 8601 时间/持续时间序列化为 Rust 结构的数据成员,这可能吗?
我已经对 serde 序列化和 chrono 进行了一些初步研究,但除了非常基本的日期时间序列化之外,我没有发现太多其他内容。不完全是我想做的事。
当然,一切皆有可能,但在这种情况下,您将必须自己进行一些提升或使用另一个板条箱,因为 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。