2017-01-11 5 views
3

Ich zeige ein Datum auf dem Bildschirm mit der Chrono-Kiste.Konvertieren einer UTC-Zeit über Zeitzonen

Das Datum soll in der vom Benutzer bevorzugten Zeit oder UTC angezeigt werden, wenn nein gesetzt ist.

Ich habe die UTC-Standard eingerichtet, aber ich bin unsicher über die beste Methode zum Aufzeichnen der Zeitzone des Benutzers und wie man dies auf das aktuelle Datum anwenden.

Hinweis: date möglicherweise nicht hier festgelegt, so würde ich lieber date ändern, anstatt einen anderen Konstruktor zu verwenden.

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(); 

Was ich möchte, ist ein Typ für user.timezone und ein Beispiel für die Verwendung, wie das Datum einzustellen.

Antwort

3

Sie können die Kiste chrono-tz verwenden, mit der Sie eine Zeichenfolge in eine Zeitzone mit chrono_tz::Tz::from_str("Europe/Berlin") konvertieren können. Sie müssen also nur einen gültigen Zeitzonen-String angeben.

können Sie dann

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() 
} 

verwenden Sie können die ursprünglichen date Variable nicht ändern, weil die Typen nicht übereinstimmen. Die Zeitzone ist Teil des Typs. Wenn Sie vollständig zu DateTime<chrono_tz::Tz> wechseln, könnten Sie die Variable ändern, aber alle Ihre Verwendungen von DateTime müssten geändert werden.

Verwandte Themen