2017-06-08 5 views
1

So bekomme ich das Treiberdatum von der Grafikkarte und zeige es in eine TextBox, aber der Wert kommt so 20161216000000.000000-000 und ich möchte es in ein echtes Datum umwandeln.Formatierung von Datum und Uhrzeit mit einer Funktion in C#

Ich habe bereits eine Funktion, um diese Art von Daten zu konvertieren, aber es funktioniert dieser Fall nicht und nach der Verwendung zeigt es mir so 01-01-0001 00:00:00.

Das ist mein Funktionscode:

private static string FormatDateTime(object ObjInstallDate) 
{ 
    object FinalDate = DBNull.Value; 
    string strDate = Convert.ToString(ObjInstallDate); 
    DateTime dtm; 
    DateTime.TryParseExact(strDate, new string[] { "yyyyMMdd", "yyyy-MM-dd", "dd-MM-yyyy" }, 
     System.Globalization.CultureInfo.InvariantCulture, 
     System.Globalization.DateTimeStyles.None, out dtm); 
    if (!String.IsNullOrEmpty(strDate)) 
    { 
     FinalDate = dtm; 
    } 
    return FinalDate.ToString(); 
} 

Haben Sie eine Ahnung, wie ich in diesem Fall 20161216000000.000000-000 so etwas wie 2016-12-16 bekommen kann?

+0

Es sieht aus wie es auch Zeitinformationen enthält. Zuerst würde ich versuchen zu überprüfen, ob 'TryParse' schon damit umgehen kann (ohne den genauen Teil). Tut mir leid, ich kann mich nicht darum kümmern, es für dich zu suchen. Wenn nicht, können Sie einfach das gewünschte Bit einfach unterteilen: 'DateTime.TryParseExact (strDate.Substring (0, 8)," yyyyMMdd ", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dtm) ; ' – musefan

Antwort

0

eine Teilnahme macht den Job (wenn das Format immer angezeigt LIKE ist):

DateTime.TryParseExact(strDate.Substring(0, 8), "yyyyMMdd", 
    System.Globalization.CultureInfo.InvariantCulture, 
    System.Globalization.DateTimeStyles.None, out DateTime dtm); 

das gewünschte Format Um das Ergebnis zu präsentieren Sie

dtm.ToString("yyyy-MM-dd"); 
+0

Es hat freundlicherweise das Problem gelöst, aber es gibt kein, um die 00:00:00 auszuziehen, weil ich es nicht brauche? – Rekcs

+0

Nein der 'DateTime' Typ besteht aus einem Datum und einer Uhrzeit. Ignorieren Sie einfach die Zeit in Ihrem Code. (https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx) – Fruchtzwerg

+0

Also gibt es nicht weg, um es in der 'TextBox' loszuwerden? – Rekcs

0

Nach einem Blick auf Ihrer Verwendung Code und Frage es sieht aus wie das Datum, das Sie an die Funktion übergeben, ist nicht im richtigen/erwarteten Format, das C# unterstützt, deshalb gibt es Ihnen das Anfangsdatum des Standardsystems, das 01-01-0001 00:00:00 ist Hier.

Aber als workl um, wie ich Datumsteil erste 8 Ziffer des Eingangswertes beobachten kann, ist, so können Sie dies in folgenden Weise verwenden:

DateTime.TryParseExact(strDate.Substring(0, 8), "yyyyMMdd", 
System.Globalization.CultureInfo.InvariantCulture, 
System.Globalization.DateTimeStyles.None, out dtm); 

return dtm.ToString("yyyy-MM-dd"); 
+0

Ja, danke ich schon nicht. Danke für deine Hilfe trotzdem. – Rekcs

0

Sie nur Ihr Format, um sicherzustellen, benötigten Entsprach Ihrer Eingabe, die keines Ihrer bereitgestellten Eingabeformate tat.

Sehen Sie, wie die custom dateformat specifiers und Literal-Zeichen mit Ihrer Eingabe Line-up.

  Your input: 20161216000000.000000-000 
    format specifiers: yyyyMMddhhmmss.ffffff-000 

dieses Format auf Ihre Methode bringen Sie diese bekommen:

// takes an object, returns a DateTime or null in case of failure 
DateTime FormatDateTime(object ObjInstallDate) 
{ 
    DateTime dtm; 
    if (!DateTime.TryParseExact(
     (string) ObjInstallDate, // notice that we don't hassle with the input here, 
           // only cast to a string 
           // we simply rely on the parser of DateTimer.TryParseExact 
     "yyyyMMddhhmmss.ffffff-000", // this matches the format 
             // if the -000 represents a timezone 
             // you can use z00 or zz0 
             // don't use zzz as that expects -0:00 
     System.Globalization.CultureInfo.InvariantCulture, 
     System.Globalization.DateTimeStyles.None, 
     out dtm)) 
    { 
     // an invalid date was supplied, maybe throw, at least log 
     Console.WriteLine("{0} is not valid", ObjInstallDate); 
    } 
    // we either return here null or a valid date 
    return dtm; // !! No ToString() here 
} 

I Kirsche Wert nahm die benötigte benutzerdefinierte Format von Custom Date and Time Format Strings.

Beachten Sie, dass ich die DateTime-Instanz, die erstellt wurde, einfach zurückgeben. Du wirst als nächstes sehen, warum ich das mache.

Da Sie die DateTime auf einem WinForm anzeigen möchten (ich nehme an, in einem Textfeld, aber ein Etikett funktioniert auch) können Sie einfach die DateTime-Instanz in das Textfeld Databind und lassen Sie die Datenbindung die Formatierung tun. Hier ist ein Codebeispiel, das in LinqPad ausgeführt werden kann:

// take a string and make a date of it 
var str = "20161216000000.000000-000"; 
DateTime dtm = FormatDateTime(str); 

// show it on a Databind TextBox 
var f = new Form(); 
var txt = new TextBox(); 
txt.Width = 200; 
// bind the Text property 
txt.DataBindings.Add(
    "Text", // property on the textbox 
    dtm, // our DateTime object 
    null, // use the DateTime instance, not a property 
    true, // use formatting 
    DataSourceUpdateMode.OnValidation, 
    null, // value to indicate null 
    "yyyy-MM-dd"); // our format 
f.Controls.Add(txt); 
f.Show(); 

Ich bin mit der Überlastung des Add auf dem DataBindingsCollection, die einen Format-String nimmt. Ich kann dann dieselben benutzerdefinierten Formatbezeichneroptionen verwenden, um diese DateTime-Instanz so darzustellen, wie ich möchte. Von hier aus wäre es einfach, eine andere TextBox hinzuzufügen, die dieselbe DateTime-Instanz verwendet, aber den Monat zum Beispiel in Text anzeigt.

Wenn all dies kommt zusammen wird dies Ihr Ergebnis sein:

winform shows textbox with 2016-12-01 as date