簡體   English   中英

C#:如何將字符串轉換為DateTime,其中字符串可以具有任何標准日期時間格式

[英]C# : How to convert string to DateTime, where the string can have any of the standard datetime format

我在DateTime上發布了一個關於String轉換的問題,我得到了很多令人滿意的答案..所以我非常感謝StackOverflow ..
這是String manupulation的另一個問題,我被困住了..

我必須使用C#代碼轉換字符串(來自某些外部源)。字符串可以具有這些預期的DateTime格式。

  1. 02/31/2009 01:59:59 24小時格式
  2. 02/31/2009 01:59:59 AM 12小時格式
  3. 2/31/2009 1:59:59
  4. 2/31/2009 1:59:59 AM
  5. 02/01/2009 01:59:59 AM
  6. 2/1/2009 1:59:59
  7. 等等 .......

我嘗試使用DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
即,通過提取月,日等的值

但是它不起作用..因為我不能完全用子串提取值...因為字符串的長度是變化的
" and ":" but it becomes bottle neck to derive with (non-)Occurrence of AM/PM 我也試圖提取“/”,“ ”和“:”的出現值,但它變成瓶頸,導出(非)發生AM / PM

只有日,月和小時的長度可以變化..

您可以使用DateTime.ParseExact重載,該重載采用以下格式列表:

private static string[] formats = new string[]
    {
        "MM/dd/yyyy HH:mm:ss tt",
        "MM/dd/yyyy HH:mm:ss",
        "M/dd/yyyy H:mm:ss tt",
        "M/dd/yyyy H:mm:ss"        
    };

private static DateTime ParseDate(string input)
{
    return DateTime.ParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
}

如果傳遞的字符串與任何給定格式不匹配,則拋出FormatException 請注意,期望AM / PM的格式應出現在沒有AM / PM的相同格式之前( "MM/dd/yyyy HH:mm:ss tt"出現在"MM/dd/yyyy HH:mm:ss" )。

更新
正如Henk在評論中指出的那樣,使用TryParseExact時可以使用相同的功能來刪除異常情況。 此外,與可空類型配對,這可以更清潔:

private static DateTime? ParseDate(string input)
{
    DateTime result;
    if (DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
    {
        return result;
    }
    return null;
}

現在,如果它無法解析輸入,它將只返回一個空引用。

看一下TryParseExact方法。 這是第一個案例的例子:

DateTime date;
// I changed 02/31/2009 to 01/31/2009 because the first is not a valid date
if (DateTime.TryParseExact("01/31/2009 01:59:59", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out date))
{
    // string successfully parsed => do something with the date
}

然后,您可以保留不同格式的列表,並嘗試使用所有格式解析字符串,直到成功為止。

以下是所有可能的格式..

  1. MM / dd / yyyy 08/22/2006
  2. dddd,dd MMMM yyyy 2006年8月22日星期二
  3. dddd,dd MMMM yyyy HH:mm星期二,2006年8月22日06:30
  4. dddd,dd MMMM yyyy hh:mm tt星期二,2006年8月22日06:30 AM
  5. dddd,dd MMMM yyyy H:mm星期二,2006年8月22日6:30
  6. dddd,dd MMMM yyyy h:mm tt 2006年8月22日星期二上午6:30
  7. dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
  8. MM / dd / yyyy HH:mm 08/22/2006 06:30
  9. MM / dd / yyyy hh:mm tt 08/22/2006 06:30 AM
  10. MM / dd / yyyy H:mm 08/22/2006 6:30
  11. MM / dd / yyyy HH:mm:ss 08/22/2006 06:30:07
  12. MMMM dd 8月22日
  13. yyyy' - 'MM' - 'dd'T'HH':'mm':'ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
  14. ddd,dd MMM yyyy HH':​​'mm':'ss'GMT'Tue,2006年8月22日06:30:07 GMT
  15. yyyy' - 'MM' - 'dd'T'HH':'mm':'ss 2006-08-22T06:30:07
  16. HH:mm 06:30
  17. hh:mm tt 06:30 AM
  18. H:mm 6:30
  19. h:mm tt 6:30 AM
  20. HH:mm:ss 06:30:07
  21. yyyy' - 'MM' - 'dd HH':​​'mm':'ss'Z'2006-08-22 06:30:07Z
  22. dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
  23. yyyy MMMM 2006年8月

DateTime dt1 = DateTime.ParseExact(“2007/01/01 04:23:12”,“yyyy / MM / dd hh:mm:ss”,System.Globalization.CultureInfo.CurrentCulture);

DateTime dt = Convert.ToDateTime(“2007/01/01 04:23:12”,System.Globalization.CultureInfo.CurrentCulture);

System.Globalization.CultureInfo.CurrentCulture格式參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM