Преобразование времени 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 нужно будет изменить.

Другие вопросы по тегам