【问题标题】:Converting a UTC time via Timezones通过时区转换 UTC 时间
【发布时间】:2017-05-25 17:34:34
【问题描述】:

我正在使用 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 的类型以及如何设置日期的示例。

【问题讨论】:

    标签: rust timezone rust-chrono


    【解决方案1】:

    您可以使用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&lt;chrono_tz::Tz&gt;,那么您可以修改变量,但您对DateTime 的所有使用都需要更改。

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2013-06-30
      • 2022-11-30
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多