Laden...

Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?

Erstellt von JimStark vor 3 Jahren Letzter Beitrag vor 3 Jahren 837 Views
JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren
Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?

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?

G
16 Beiträge seit 2019
vor 3 Jahren

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?!

H
48 Beiträge seit 2020
vor 3 Jahren

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}}" />
JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

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

5.657 Beiträge seit 2006
vor 3 Jahren

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

JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

Ja, der braucht aber auch ein DateTime. Mit dem extra Feld geht es jetzt.