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
c# Datum umwandeln?
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

c# Datum umwandeln?

beantworten | zitieren | melden

Ich poste das mal in den Grundlagen, weil ich denke ein Datum in ein anderes Format umwandeln ist eine Grundlage der Programmierung. Hoffe das passt so.
Also folgender Code funktioniert bestens:


            // Letzter Boot-Zeitpunkt auslesen
            try
            {
                var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
                using (ManagementObjectCollection managementObjectCollection = searcher.Get())
                {
                    ManagementObject managementObject = managementObjectCollection.OfType<ManagementObject>().FirstOrDefault();

                    string stringDate = managementObject["LastBootUpTime"].ToString();
                    DateTime dt = ManagementDateTimeConverter.ToDateTime(stringDate);
                    systemLastStart = dt.ToLongDateString();
                    computerLocation = managementObject["Description"].ToString();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Problem im Abschnitt Letzter Boot-Zeitpunkt");
            }
Bekomme dann ein gutes Ergebnis wie
Zitat
Mittwoch, 7. Juli 2021

Ich benutze den gleichen Code nun für die Abfrage von Win32_QuickFixEngineering und dem managementObject["InstalledOn"].
Das gibt folgenden Fehler:
Zitat
System.ArgumentOutOfRangeException: Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
Parametername: dmtfDate bei System.Management.ManagementDateTimeConverter.ToDateTime(String dmtfDate)

Schreibt man den Code wie folgt, dann gibt es ein Datum wie dieses zurück:


[...]
systemLastWindowsUpdate = managementObject["InstalledOn"].ToString();
[...]
Zitat
6/22/2021

Also recherchiert, gemacht und getan, wie man das Format mm/dd/yyyy umwandeln kann.
Scheinbar guter Treffer hier.
Code umgesetzt, aber es gibt folgenden Fehler:



[...]
using System.Globalization;

string d = Convert.ToDateTime("09/25/2011").ToString("dd/MM/yyyy"); //returns 25/09/2011
DateTime date = DateTime.Parse("09/25/2011", new CultureInfo("en-GB")); // returns 09/25/2011
string d2 = date.ToString("dd/MM/yyyy"); //should return 25/09/2011
systemLastWindowsUpdate = d.ToString();
[...]
Zitat
System.FormatException: Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.
bei System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
bei System.Convert.ToDateTime(String value)

Auch folgender Versuch scheitert mit
Zitat
System.ArgumentOutOfRangeException: Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
Parametername: dmtfDate bei System.Management.ManagementDateTimeConverter.ToDateTime(String dmtfDate)


            try
            {
                var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering");
                using (ManagementObjectCollection managementObjectCollection = searcher.Get())
                {
                    ManagementObject managementObject = managementObjectCollection.OfType<ManagementObject>().FirstOrDefault();
                    string stringDate = managementObject["InstalledOn"].ToString();
                    DateTime dt = ManagementDateTimeConverter.ToDateTime(stringDate);

                    int day = dt.Day;
                    int month = dt.Month;
                    int year = dt.Year;

                    string date = (year + "-" + month + "-" + day).ToString();

                    systemLastWindowsUpdate = date;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                //MessageBox.Show("Problem im Abschnitt Windows Update.");
            }


Ich habe natürlich mehr recherchiert und probiert, aber ich komme nicht zum Erfolg. Kann mir bitte jemand sagen, wo es nun schon wieder klemmt?
Als kleiner Bonus suche ich noch die Möglichkeit Win32_QuickFixEngineering nach dem letzten Datum zu sortieren und nur dieses dann auszugeben.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Punkt 1: verwende DateTimeOffset und nicht DateTime
[FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET
(Ich weiß, dass der alte DMTF Konverter das nicht macht, ändert an der Sachlage nichts)

Der DMTF Wert ist ein lokaler Wert (zumindest die Rückgabe von ManagementDateTimeConverter) d.h. wenn Du den Wert nicht nur anzeigen sondern ihn speichern willst, musst ihn entsprechend erst umwandeln, damit Du die Zeitzone nicht verlierst.


DateTimeOffset date = DateTime.SpecifyKind(ManagementDateTimeConverter.ToDateTime(dmtfDate), DateTimeKind.Local);
Es ist immer hilfreich, wenn Du Deinen eigenen Code debuggst, um zu sehen, woher der Fehler kommt.
Wenn Du schon die Fehlermeldung bekommst, dass das Format nicht stimmt: dann prüf das doch :-)
Wir erkennen hier nicht, welche Werte Du in die Methoden reinkippst, wir haben keine Glaskugel; das kannst selbst mit dem Debugger prüfen.

Wenn die Exception kommt, dass das Format nicht stimmt, dann kannst Du dem vertrauen, dass das Format nicht stimmt.
Dann ist das zu 100% der Hinweis: Überprüf das Format, das Du erwartest und vergleich das mit dem Wert, den Du reinkippst - da stimmt was nicht.

Dein Code ist ansonsten prinzipiell auch voll von Logikfehlern, zB. wenn Du überhaupt kein Datum ermitteln kannst versuchst Du es zu parsen.
Das würde so aussehen, dass das Datum ungültig sei: aber es ist nicht mal ein Datumswert bzw. mit FirstOrDefault musst Du Dir bewusst sein, dass es ein Default geben kann, was hier null bedeutet; Du aber ungeprüft auf das Element zugreifst.
Du solltest entsprechend schon a) prüfen, ob Du überhaupt Werte ausliest und b) ob diese überhaupt ein Datum darstellen.

Ansonsten muss man sagen, dass kaum ein Bereich in C# so extrem detailliert dokumentiert ist, wie die Formatzeichen:
Standardformatzeichenfolgen für Datum und Uhrzeit
Hinweis: "mm" ist was anderes als "MM"
Zitat
string date = (year + "-" + month + "-" + day).ToString();
.. und genau das macht man nicht, was auch in der Format-Doku steht :-)
Die Format Doku sagt: bau nicht von Hand zusammen, sondern verwende die Standards.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Krieg es nicht geknackt

Das "beste" was jetzt bei rausgekommen ist das. Alle Versuche aus "x" ein gescheites Datum zu formatieren scheiterten.
Zitat
6.22.2021
Ich brauche es aber als 2021-06-22, damit es ordentlich in MySQL-Eingetragen werden kann. Die Spalte dort ist vom Tyo "date".


                var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering");
                using (ManagementObjectCollection managementObjectCollection = searcher.Get())
                {
                    ManagementObject managementObject = managementObjectCollection.OfType<ManagementObject>().First();
                    string stringDate = managementObject["InstalledOn"].ToString();

                    DateTimeOffset PassDate = DateTimeOffset.UtcNow;
                    var dateFormat = stringDate;
                    var x = PassDate.ToString(dateFormat);

                    systemLastWindowsUpdate = x.ToString();

                }
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Was erwartest denn was rauskommt, wenn Du rumstocherst?
Dir wurd nun in verschiedenen Themen schon von mehreren Personen ans Herz gelegt: les die Dokus. Mit dem Try and Error-Vorgehen wirst erfahrungsgemäß nicht auf nen grünen Zweig kommen. Keiner hier hat Lust Dir das Zeug aus der Doku zu kopieren.

Du siehst doch selbst, dass "InstalledOn" mit dem Format "d/M/yyyy" ausgegeben wird.
Keine Raketenwissenschaft.

Und wenn Du jetzt die Doku der Formate auch nur ein mal gelesen hättest wüsstest Du, dass Du den Eingangswert und das Format einfach nur noch DateTimeOffset.ParseExact übergeben musst. Und die Methode hat auch ne Doku, wie sie verwendet wird - mit Beispielen.
DateTimeOffset.ParseExact Methode (System)

Du aber nimmst die aktuelle Uhrzeit und übergibst dann das Datum als Format, statt ein Format.
Das ist Jahrhunderte weit weg von dem, was man tun soll - und die Doku zeigt.

Ich sag Dir nun bewusst nicht die Lösung; einfach damit Du lesen musst und mit dem Rumstochern aufhörst.
Das ist Deine Aufgabe - auch / vor allem als Anfänger. Sonst wirst es nie lernen.
Zitat
Ich brauche es aber als 2021-06-22, damit es ordentlich in MySQL-Eingetragen werden kann. Die Spalte dort ist vom Tyo "date".
Auch das ist in dem Link von mir erklärt, wie man Zeitstempel in mySQL mit .NET üblicherweise speichert.
Wenn Du aber es als Date-Objekt in mySQL Speicher willst: [Artikelserie] SQL: Parameter von Befehlen
Da steht drin, wie es korrekt geht, ohne String-Frickeleien.

Und wenn Du es anders formatiert als Text speichern willst: auch das ist in der Doku erklärt; und auch in meinem Link.
Mit Beispielen der Formate, die Du ToString übergeben musst.
=> Lesen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2136

beantworten | zitieren | melden

Als welcher Datentyp ist denn das Datum in Win32_OperatingSystem gespeichert?
Dieses ToString überall finde ich eine Katastrophe, machen anfangs alle. Alles was man hat wird in einen String gewandelt und dann wieder mühsam zurück.
Wenn die Tabelle Win32_OperatingSystem sauber angelegt ist, ist das Datumsfeld bereits ein Datum und muss nur noch passend gecasted werden.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4136

beantworten | zitieren | melden

Laut Win32_OperatingSystem sind zumindestens InstallDate, LastBootUpTime und LocalDateTime schon vom Typ DateTime.

Nur leider InstalledOn in Win32_QuickFixEngineering nicht (InstallDate aber schon)...
Man beachte auch die "Note" bzgl. FILETIME.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Ich mag mich täuschen, vielleicht gibt es auch einen Weg; aber so wie ich das sehe ist das einfach nur ein String.
Der Typ Datetime gilt nur für den Provider mit der API, aber nicht für das ManagementObject.

Hab das Zeug mit ParseExact aus meinem vorherigen Post ausprobiert: funktioniert einwandfrei.
Zitat von chilic
Wenn die Tabelle Win32_OperatingSystem sauber angelegt ist, ist das Datumsfeld bereits ein Datum und muss nur noch passend gecasted werden.
Das ist WMI und keine Datenbank ;-) Zumindest der hier ersichtliche Code.
Das MySQL Zeug sehen wir hier nicht; aber prinzipiell hast Du recht: dafür verwendet man dann Parameter.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4136

beantworten | zitieren | melden

Dafür gibt es explizit die Methode ManagementDateTimeConverter.ToDateTime(String).

Wer mit WMI arbeitet, muß doch die Klassen aus System.Management kennen (oder zumindestens dann deren Doku lesen)!?!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Die Methode verwendet er ja auch bei "LastBootUpTime", wo dies nötig ist, da dieses Datum als DMTF zurück geliefert wird.
Bei "InstalledOn" hingegen muss man das Format parsen. D.h. das "Object" DateTime hilft ihm hier nicht.
Zitat
oder zumindestens dann deren Doku lesen
Ja, dieses Defizit ist insgesamt vorhanden, wie wir sehen konnten.

Er hat ja zwei Themen:
- Datumwerte aus verschiedenen Quellen holen (DMTF / über das Format)
- Speichern in mySQL
Im Endeffekt beides Dinge, die er aktuell nicht schafft, weil er die Doku dazu leider nicht lesen mag.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4136

beantworten | zitieren | melden

Da hatte ich wohl deinen Beitrag mißverstanden. Ich dachte, du meinst, daß man generell die DateTime-Werte daraus selber als String parsen muß.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Also generell / zumindest bei den Werten hier liefert WMI String-Werte für die Datums-Felder. DMTF ist ja auch ein String (in einem speziellen Format).
Oder über seh ich etwas, dass direkt zu einem DateTime(Offset) Objekt gecastet werden könnte? Seh ich keine API für.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Ich finde es unfair immer zu behaupten ich würde die Doku nicht lesen. Das ich es vielleicht einfach nicht verstehe, darauf kommt Abt nicht :*(. Ich suche ja auch deswegen auch in anderen Quelle, wo das ganze nochmal anders erklärt oder dargestellt wird.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Würde diese Aussage verstehen, wenn Du nur von mir und/oder nur in diesem Thread das Feedback bekommen hättest, dass Du offenbar die Doku maximal überfliegst bzw. mindestens den Eindruck dazu hinterlässt, weil die Fortschritte nich zum Ergebnis passen ;-)
Dein String-Format Problem hier lässt sich mit einem Code Beispiel aus der Doku lösen. Ich hab Dir sogar die Schritt-Anleitung gegeben, wie Du es findest.

Der Sinn eines Forums ist ja die Hilfe zur Selbsthilfe.
Und wir helfen Dir den Fehler zu lösen; und in diesem Fall ist das ein sehr gut dokumentierter Fehler, den Du wirklich einfach nachlesen kannst.

Das Leben eines Software Entwicklers besteht nun mal hauptsächlich aus: Lesen - vor allem bei neuen Dingen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Wenn ich mit einem Beispiel nicht klar komme suche ich nach Alternativen. In der Programmierung gibt es ja in 99% der Fälle mehrere Wege zum Ziel. Mir ist es wichtig nach zu vollziehen was ich mache. Wenn dem nicht der Fall ist frage ich, wie bei der Sache mit dem ??-Parametern.

Die Microsoft-Doku hat mir übrigens bislang eher selten weiter geholfen. Auf stackoverflow wurde ich hingegen schon öfters fündig, zumindest dann nachdem ich wusste, wonach ich eigentlich suche. Dazu kamt dann in der Regel noch ihr, wo es dann partout klemmte.

Was ich in dem Fall jetzt nicht verstehe: Ich habe einen dummen String von beispielsweise 6/22/2021 oder 6.22.2021. Warum kann ich diese Zahl direkt in den Quelltext schreiben und umformatieren, aber nicht, wenn exakt die gleiche Zahl aus einer Variablen kommt? Das kapiere ich nicht.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat von Little Tester
Warum kann ich diese Zahl direkt in den Quelltext schreiben und umformatieren, aber nicht, wenn exakt die gleiche Zahl aus einer Variablen kommt? Das kapiere ich nicht.
Das wird nicht so sein. Deswegen wurdest Du auf den Debugger aufmerksam gemacht.
Der Quellcode sagt immer die Wahrheit.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 292

beantworten | zitieren | melden

Zitat von Little Tester

Was ich in dem Fall jetzt nicht verstehe: Ich habe einen dummen String von beispielsweise 6/22/2021 oder 6.22.2021. Warum kann ich diese Zahl direkt in den Quelltext schreiben und umformatieren, aber nicht, wenn exakt die gleiche Zahl aus einer Variablen kommt? Das kapiere ich nicht.
Woran scheitert es jetzt genau?
Abt hat dir doch den Link gegeben:


public static DateTimeOffset ParseExact (string input, string[] formats)
formats: Ein Array von Formatbezeichnern, die die erwarteten Formate von input definieren.

Und das Beispiel zeigt genau wie du es machen musst:


string[] formats = new string[] {@"@M/dd/yyyy HH:m zzz", @"MM/dd/yyyy HH:m zzz",
                                 @"M/d/yyyy HH:m zzz", @"MM/d/yyyy HH:m zzz",
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 106
Herkunft: Radeberg

beantworten | zitieren | melden

Hallo Little Tester,

ich hab mir mal im Forum deine Beiträge angeschaut. Für mich entsteht der Eindruck, dass du die Grundlagen von C# noch nicht verstanden hast. Damit verstehst du auch die Doku nicht.
Schaun wir uns mal den Code vom 10.07.2021 - 23:51 an.
- in Zeile 7 erzeugst du dir ein DateTimeOffset mit der aktuellen Zeit... warum? was willst du damit?
- in Zeile 8 kopierst du einen String in einen Neuen... was willst du damit erreichen?
- in Zeile 9 übergibst du diesen String der ToString-Methode. Der String enthält aber nur dein Datum. Dort muss aber die Formatierung hin.
- und in Zeile 11 rufst du nochmal ToString auf... warum? x ist doch schon ein String

Als erstes muß du den String in ein DateTimeOffset umwandeln-> parsen. Diese Methode braucht einige Informationen. Ein Datum kann unterschiedliche Formatierungen haben. Es gibt zB. Unterschiede zwischen England und USA. Die Methode hat keine Glaskugel, du mußt es ihr also sagen.
Und wenn du wieder einen String haben willst, dann nimmst du ToString. Aber auch diese Methode muß wissen, wie der String formatiert werden muss.
-Wer lesen kann, ist klar im Vorteil
-Meistens sitzt der Fehler vorm Monitor
-"Geht nicht" ist keine Fehlermeldung !

GidF
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Also das "Problem" war, dass ich einfach mit dem String weiter arbeiten wollte. Für mich ist 6/22/2021 nunmal 6/22/2021. Für den Debugger offenbar nicht, obwohl er das sagt. Ist halt so. Verstehen tu ich das nicht (Siehe Bild)

Nun habe ich mich an das Beispiel aus der Doku gemacht. Das erste Beispiel habe ich nicht zum Laufen bekommen, trotz des richtigen Formats (M/dd/yyyy bzw. M/d/yyyy).

Das zweite Beispiel mit "with leading white space" hat dann immerhin ein Ergebnis gegeben, aber nicht, das, was ich mir erhofft habe. Umwandeln klappte natürlich damit erst recht nicht.

22.06.2021 00:00:00 +00:00


                    string stringDate = managementObject["InstalledOn"].ToString();
                    string format = "M/dd/yyyy"; // M/d/yyyy geht auch
                    CultureInfo provider = CultureInfo.InvariantCulture;
                    DateTimeOffset result = new DateTimeOffset();
                    result = DateTimeOffset.ParseExact(stringDate, format, provider, DateTimeStyles.AssumeUniversal);
                    systemLastWindowsUpdate = result.ToString();
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Little Tester am .
Attachments
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Dein Code macht exakt das, was Du programmiet hast.
Das, was mit Deinen Worten "nicht" geht ist das bereits mehrfach genannte Format, das Dir im letzten ToString fehlt.

Wenn Du ToString kein Format bei der Ausgabe zum String mit gibst, dann kommt genau das raus, was Du hier siehst.
So funktioniert String Formatierung, und so ist es dokumentiert ;-)

Es bleibt mir nichts anderes als anzunehmen, dass Du nicht ein Beispiel aus der Doku wirklich ausprobiert hast, um die Funktionsweise zu verstehen.
Dann ist klar, dass Du von der Dokumentation nichts lernst und auf Copy-Paste Quellen wie Stack Overflow setzt...
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4136

beantworten | zitieren | melden

Du scheinst den Unterschied zwischen dem Datentyp DateTime(Offset) und der String-Repräsentation nicht zu verstehen.

Die Ausgabe bei deinem Code ist völlig korrekt so, denn deine letzte Zeile gibt mit ToString() das Datum und die Uhrzeit in der auf deinem Rechner eingestellten Form aus (d.h. im deutschen Format).
Möchtest du es explizit wieder in einem bestimmten Format ausgeben, dann mußt du es der Methode mitteilen, z.B.


systemLastWindowsUpdate = result.ToString(format);

Nur ist so die Umrechnung in deinem Code natürlich komplett überflüssig.
Die Frage ist also, was willst du genau haben (als DateTime(Offset) oder aber als String)?
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

OK, jetzt gehts. Meine Güte. Was ein Umstand nur um nen blöden String auf Linie zu bringen. Danke für eure Geduld.


                    systemLastWindowsUpdate = result.ToString("yyyy-MM-dd");
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

beantworten | zitieren | melden

Zitat von Little Tester
Das zweite Beispiel mit "with leading white space" hat dann immerhin ein Ergebnis gegeben, aber nicht, das, was ich mir erhofft habe. Umwandeln klappte natürlich damit erst recht nicht.

22.06.2021 00:00:00 +00:00


                    string stringDate = managementObject["InstalledOn"].ToString();
                    string format = "M/dd/yyyy"; // M/d/yyyy geht auch
                    CultureInfo provider = CultureInfo.InvariantCulture;
                    DateTimeOffset result = new DateTimeOffset();
                    result = DateTimeOffset.ParseExact(stringDate, format, provider, DateTimeStyles.AssumeUniversal);
                    systemLastWindowsUpdate = result.ToString();

Und wenn Du die letzte Zeile wie folgt schreibst?


systemLastWindowsUpdate = result.ToString("yyyy-MM-dd");
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1892
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@Little Tester
Es wäre einfacher gewesen, sich die Zeit zu nehmen und die Doku mal durchzuarbeiten.
Aber genau hier ist dein eigentliches Problem.

Das hättest du auch alles mit den Code Beispielen testen können.
Selbst ein einfacher UnitTest oder Test Program wäre schneller zusammen gebaut und getestet worden.

Dies hätte man in wenigen Minuten machen können und durch die Doku auch recht schnell lösen können.
Aktuell verbrennst du aber viel Zeit damit irgendwas zu machen und ohne einer richtigen Vorgehensweise mal die Sache zu durchdenken.
Dadurch verschwendest du in erster Linie deine Zeit, aber alle anderen müssen dir dann wieder alles erklären was längst dokumentiert und sogar mit Beispielen in der Doku steht.

Du solltest dir dringend die Zeit nehmen die Grundlagen der Sprache anzueignen und die Konzepte dahinter verstehen bevor du solche Projekte anfängst.
Du macht hier den klassischen Fehler, den viele Einsteiger machen.
Man kopiert sich irgendwelche Lösungen zusammen und wundert sich warum diese für den eigenen Zweck nicht funktionieren.
Auch das ist ein Grundproblem was man nur durch Erfahrung und lernen lösen kann.
Ansonsten wirst du in jedem weiteren Thread nur um Hilfe schreien und andere müssen dir die Grundlagen erklären.
Das ist nicht Sinn und Zweck des Forums.

Also nimm dir bitte die Zeit und arbeite dich erstmal in C# und .NET ein bevor du größere Projekte angehst.
Somit machst du dir selbst das Leben ungemein leichter.
So bist du auch nicht zwingend wegen jeder Kleinigkeit auf das Forum oder andere angewiesen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Ich bräuchte da nochmal eure Hilfe. Ich möchte nur das letzte Installationsdatum. Bei Stackoverflow hat man mir eine Lösung präsentiert, aber wenn ich die anwenden zu versuch, knallts wieder beim Datumsformat. Habs jedenfalls nicht hinbekommen.

Toll wäre also, wenn ihr mir sagen könntet, wie ich das maxDate in meinen Code einbauen kann oder nach Datum sortieren kann, womit ich dann ja auch automatisch das oberste bekommen würde. Letzteres würde die Möglichkeit offen halten (mit Version 2.0 meines Tools) einen Updateverlauf anzuzeigen.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1892
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Dann nutzt den Debugger und schau dir die Werte an.
Wenn das Format knallt, schau dir den Wert im Debugger an und ändere dein Format.
Wie gesagt, lies dich in die Grundlagen ein.
Ansonsten springst du weiter von einer Mine auf die nächste und musst wegen jeder Kleinigkeit nachfragen.

Anbei sind Cross Posts hier nicht erwünscht.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Moderationshinweis von Abt (05.08.2021 - 19:24:24):

Crossposts sind nicht nur bei uns untersagt, sondern i.d.R. auf jeder Wissensplattform / jedem Forum.
Gründe siehe [Hinweis] Wie poste ich richtig?

Auf Stack Overflow (weil es hier referenziert ist) dokumentiert zB unter respect the commmunity.
Die Folge auf Stack Overflow ist i.d.R. eine Themensperrung wenn man Glück hat oder durchaus auch eine Kontensperrung, wenn man Pech hat.

private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Auf Stackoverflow soll doch nicht diskutiert / Smaltalk gehalten werden, sondern nach Möglichkeit ausschließlich Code gepostet werden. Selbst meine Begrüßung im Erstposting wurde wegeditiert. Also anders als hier. Deswegen war das für mich kein Crossposting, sondern eine erweiterte Nachfrage zu einem existierendem Thema. Außerdem hat dort ja niemand mehr geantwortet und ich rechne auch nicht mehr damit. Dafür ist die Plattform zu groß und unübersichtlich, so dass mein Post irgendwo in den Untiefen untergegangen ist. Wundert mich eh, wie das funktioniert.

Beim Debug bekomme ich irgendwie überhaupt gar nichts.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Little Tester am .
Attachments
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1892
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

maxDate ist an dem Punkt auch nicht initalisiert, dadurch ist es DateTime.MinValue.
Du musst schauen was aus InstalledOn zurück kommt, daran musst du dein Format festmachen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Ja, aber DateTime soll man doch nicht nehmen, bzw. ist veraltet, bzw. an der Stelle auch das Falsche.
Arghs, das wird ja immer schlimmer.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Ändert an der Aussage von T-Virus nichts :-)
Zeigt aber dass du nicht verstanden hast, was die Leute dir bisher versucht haben zu erklären bzw welche Lektüre als Hilfe bekommen hast.

Hast jetzt mehrfach erklärt bekommen wie Format funktioniert, Beispiele und Lektüre, und dass das mit DateTime und DateTimeOffset identisch funktioniert.
Und da ist völlig irrelevant was du verwendest - steht auch in der Doku.

Wir drehen uns im Kreis, obwohl du die Antworten schon lange hast.
Geht schon lang am Thema vorbei. Und das Forum ist halt leider auch keine Frust-Abladestelle (und sowas wird auf SO sehr hart wegeditiert, was gut so ist).
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 106
Herkunft: Radeberg

beantworten | zitieren | melden

Mein Tipp für Anfänger, wenn du eine Aufgabe hast, dann zerlege sie in möglichst kleine Einzelaufgaben und bearbeite sie getrennt.
Hier wäre das WMI, Datum parsen und Datum ausgeben.
Dein Problem ist das Datum. Darum erstmal Doku nehmen und verstehen was dort geschrieben steht.
DateTimeOffset

Dann in Visual Studio die Console nehmen, ein kleines Testprogramm schreiben und damit spielen.
Hier mal ein Beispiel:


            var stringDate = "8-20-2021";
            string[] format = new string[] { "M/dd/yyyy", "M/d/yyyy", "M-d-yyyy" };
            var date = DateTimeOffset.ParseExact(stringDate, format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
            Console.WriteLine(date);

            Console.WriteLine("---------------------------");

            Console.WriteLine(date.ToString());
            Console.WriteLine(date.ToString("MM/dd/yyyy"));
            Console.WriteLine(date.ToString("d/M/yyyy"));
            Console.WriteLine(date.ToString("F"));
            Console.WriteLine(date.ToString("D"));
            Console.WriteLine(date.ToString("G"));

Und solange spielen, bis man es verstanden hat.
-Wer lesen kann, ist klar im Vorteil
-Meistens sitzt der Fehler vorm Monitor
-"Geht nicht" ist keine Fehlermeldung !

GidF
private Nachricht | Beiträge des Benutzers