Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 228

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Gasimodo
myCSharp.de - Member



Dabei seit:
Beiträge: 10

beantworten | zitieren | melden

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?!
private Nachricht | Beiträge des Benutzers
HansFred
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

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}}" />
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 228

Themenstarter:

beantworten | zitieren | melden

Zitat von Gasimodo
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);
            }
        }
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 228

Themenstarter:

beantworten | zitieren | melden

Ja, der braucht aber auch ein DateTime. Mit dem extra Feld geht es jetzt.
private Nachricht | Beiträge des Benutzers