通过时区转换UTC时间

tl8*_*tl8 3 timezone rust rust-chrono

我正在使用 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();
Run Code Online (Sandbox Code Playgroud)

我想要的是要使用的类型user.timezone以及如何设置日期的示例。

oli*_*obk 5

您可以使用chrono-tzcrate,它允许您将字符串转换为带有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()
}
Run Code Online (Sandbox Code Playgroud)

您不能修改原始date变量,因为类型不匹配。时区是类型的一部分。如果您完全移动到DateTime<chrono_tz::Tz>,那么您可以修改该变量,但是您DateTime需要更改所有使用的。