Hi,
ich habe folgendes Problem:
// ViewModel:
private DateTimeOffset _Date;
public DateTimeOffset Date
{
get { return _Date; }
set { _Date = value;
OnPropertyChanged(nameof(Date));
}
}
// WPF:
<TextBox Text="{Binding Date, StringFormat=d}" />
Das Datum wird mir in der Textbox korrekt angezeigt (DD.MM.YYYY).
Wenn ich das nun ändere (03.01.2020 in 02.01.2020) und abspeichere, wird das Datum -1 Tag genommen (01.01.2020). Ich denke das liegt daran dass die Stunde standardmäßig Null ist und an der internen Konvertierung von DateTime in DateTimeOffset durch das StringFormat(?).
Entferne ich das StringFormat erscheint mir das Datum als z.B. "01.01.2018 22:00 +00:00". Wenn ich jetzt das Datum ändere und übernehme stimmt es.
Hat da jemand einen Tipp damit das trotzdem funktioniert? Also das ich das kurze Datumsformat behalten kann?
Wenn mich nun nicht alles täuscht dann wird da mit UTC gerechnet und die Textbox gibt dir dann Ortszeit an, deswegen die 2h Unterschied.
Könntest ja das Datum mit einer TimeZoneInfo abspeichern?!
es ist richtig das du mit DateTimeOffset arbeitest was in .NET empfohlen ist aber die umwandlung in die aktuelle timezone muss im viewmodel selbst gemacht werde.
in wpf kannst du dazu einen eigenen converter schreiben und zum binden verwenden der das dann automatisch macht!
<Window.Resources>
<local:DateTimeOffsetToLocalConverter x:Key="DateTimeOffsetToLocalConverter" />
</Window.Resources>
<TextBlock Text="{Binding Date, Converter={StaticResource DateTimeOffsetToLocalConverter}}" />
Wenn mich nun nicht alles täuscht dann wird da mit UTC gerechnet und die Textbox gibt dir dann Ortszeit an, deswegen die 2h Unterschied.
Ja genau daran lag es! Ich habe es jetzt über ein weiteres Feld im ViewModel gelöst anstelle des Convertes. Damit geht es. Danke euch beiden!
private DateTimeOffset _Date;
public DateTimeOffset Date
{
get { return _Date; }
set { _Date = value;
OnPropertyChanged(nameof(Date));
}
}
public DateTime DateLocal
{
get
{
return Date.UtcDateTime;
}
set
{
Date = DateTime.SpecifyKind(value, DateTimeKind.Utc);
}
}
Niemand würde für ein Datumsfeld eine TextBox verwenden, dafür gibt es den DatePicker
Weeks of programming can save you hours of planning
Ja, der braucht aber auch ein DateTime. Mit dem extra Feld geht es jetzt.