Преобразование времени UTC через часовые пояса
Я показываю дату на экране, используя хронографический ящик.
Намерение состоит в том, чтобы показать дату в предпочтительное время пользователя или 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
и пример того, как установить дату.
1 ответ
Вы можете использовать chrono-tz
ящик, который позволяет преобразовать строку в часовой пояс с 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
нужно будет изменить.