我正在使用chrono crate在屏幕上显示日期。
目的是在用户首选时间或UTC中显示日期,如果没有设置。
我有UTC默认设置,但我不确定记录用户时区的最佳方法以及如何将其应用到当前日期。
注意:date
可能未在此处设置,因此我更愿意修改date
而不是使用其他构造函数。
let mut date: DateTime<UTC> = UTC::now();
//Convert to the User's Timezone if present
if let Some(user) = user {
//Extract the timezone
date.with_timezone(TimeZone::from_offset(&user.timezone));
}
let date_text = date.format("%H:%M %d/%m/%y").to_string();
我想要的是user.timezone
使用的类型以及如何设置日期的示例。
答案 0 :(得分:4)
您可以使用chrono-tz
crate,它允许您将字符串转换为chrono_tz::Tz::from_str("Europe/Berlin")
的时区。因此,您的用户所要做的就是提供有效的时区字符串。
然后您可以使用
fn date_time_str<Tz: chrono::TimeZone>(date: DateTime<Tz>, user: User) -> String {
if let Some(user) = user {
if let Ok(tz) = chrono_tz::Tz::from_str(user.timezone) {
let newdate = date.with_timezone(tz);
return newdate.format("%H:%M %d/%m/%y").to_string();
}
}
date.format("%H:%M %d/%m/%y").to_string()
}
您无法修改原始date
变量,因为这些类型不匹配。时区是该类型的一部分。如果您完全移至DateTime<chrono_tz::Tz>
,则可以修改变量,但需要更改DateTime
的所有用途。