提问人:Jeremy Jones 提问时间:9/9/2023 更新时间:9/10/2023 访问量:87
将 ISO 8601 时间/持续时间“Thhmmss-hhmm/PTmm”(即“T063000-0600/PT10M”)序列化为锈蚀结构
Serialize an ISO 8601 time/duration "Thhmmss-hhmm/PTmm" ie ("T063000-0600/PT10M") to a rust struct
问:
我正在编写一个相当简单的 REST API,我的一个对象想知道要激活的时间和持续时间。我希望我可以使用 actix-web、serde 和 chrono 将 ISO 8601 时间/持续时间序列化为 rust 中结构体的数据成员,这可能吗?
我已经对 serde serilization 和 chrono 进行了一些初步研究,但除了非常基本的日期时间序列化之外,我没有发现太多。不完全是我想做的。
答:
1赞
cdhowie
9/10/2023
#1
当然,一切皆有可能,但在这种情况下,您将不得不自己或使用其他板条箱进行一些提升,因为 chrono 的类型不提供格式化或解析实用程序。Duration
你可以很容易地实现时间的一半。请注意,chrono 没有“time with timezone”类型,因此我将使用并假设 UTC。NaiveTime
use chrono::{NaiveTime, Duration};
use serde::Serialize;
struct TimeWithDuration {
pub time: NaiveTime,
pub duration: 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: Duration) -> impl Display {
todo!()
}
format_duration
是一个占位符函数,应适当地设置持续时间的格式。您可以考虑查看 iso8601 持续时间的板条箱。
评论
0赞
Jeremy Jones
9/11/2023
我不知道注解和实现序列化之间的区别......如果有更多字段,我还需要为每个字段实现序列化,即结构如下所示#[derive(Serialize, Deserialize, Debug)] struct MoistureSensor { pub id: Uuid, pub name: String, pub description: String, pub power_pin: i32, pub analog_pin: i32, pub start_time: NaiveTime, pub duration: Duration, }
0赞
cdhowie
9/11/2023
@JeremyJones 假设该值在输入中以单个字符串值提供,您将像我在答案中一样组合并合并为一个结构体。例如,如果你有 JSON,那么你会有 .start_time
duration
{ "time_duration": "T063000-0600/PT10M" }
#[derive(Serialize)] struct MoistureSensor { pub time_duration: TimeWithDuration }
评论