2017-01-11 3 views
3

Я показываю дату на экране с помощью хронографа.Преобразование времени 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 и пример того, как установить дату.

ответ

3

Вы можете использовать ящик 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 необходимо будет изменить.

Смежные вопросы