2017-06-08 63 views
1

因此,我從顯卡獲取驅動程序日期並將其顯示爲TextBox,但其值爲20161216000000.000000-000,我想將其轉換爲實際日期。使用C#中的函數格式化日期和時間#

我已經有一個函數來轉換這種日期,但它這種情況不起作用,使用後它顯示我這樣的01-01-0001 00:00:00

這是我的功能代碼:

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

你有什麼想法,我怎麼能在這種情況下20161216000000.000000-000類似2016-12-16得到什麼?

+0

看起來它也包含時間信息。首先,我會嘗試檢查'TryParse'是否已經可以處理它(沒有確切的部分)。對不起,我不能爲你查找它。如果沒有,你可以很容易地只是子串字符串:DateTime.TryParseExact(strDate.Substring(0,8),「yyyyMMdd」,System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.None,out dtm) ;' – musefan

回答

0

以一個子做這項工作(如果總是這樣顯示的格式):

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

獲得所需要的格式呈現的結果,你可以使用

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

它很好地解決了這個問題,但是00:00:00沒有起飛,因爲我不需要它嗎? – Rekcs

+0

否DateTime類型由日期和時間組成。只要忽略代碼中的時間即可。 (https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx) – Fruchtzwerg

+0

那麼,有沒有在'TextBox'中擺脫它? – Rekcs

0

細算您代碼和問題看起來像你傳遞給函數的日期不是c#支持的正確/預期的格式,這就是爲什麼它給你默認系統的開始日期,這是01-01-0001 00:00:00這裏。

但是,由於圍繞workl,因爲我可以觀察前8位的輸入值是日期部分,這樣你就可以使用,在下列方式:

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

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

是的,謝謝我已經不是了。還是要謝謝你的幫助。 – Rekcs

0

你只需要確保您的格式匹配你的輸入,你提供的任何輸入格式都沒有。

查看custom dateformat specifiers和文字字符如何與您的輸入對齊。

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

使這一格式,以你的方法,你會得到這樣的:

// 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 
} 

我從櫻桃採摘Custom Date and Time Format Strings所需的自定義格式值。

請注意,我只是返回創建的DateTime實例。你會看到我爲什麼這麼做。因爲你想在Winform上顯示DateTime(我假設在一個文本框中,但標籤也可以工作),現在可以簡單地將DateTime實例綁定到文本框,並讓數據綁定管道進行格式化。這裏是可以在LinqPad運行的代碼示例:

// 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(); 

我使用的Add的超負荷接受一個格式字符串的DataBindingsCollection。然後,我可以使用相同的自定義格式說明符選項來表示該DateTime實例,但是我想要的。從這裏可以很容易地添加另一個使用相同的DateTime實例但在文本中顯示月份的文本框。

當這一切走到一起,這將是你的結果:

winform shows textbox with 2016-12-01 as date