C#:如何将字符串转换为DateTime,其中字符串可以具有任何标准日期时间格式
我在DateTime上发布了一个关于String转换的问题,我得到了很多令人满意的答案..所以我非常感谢StackOverflow ..
这是String manupulation的另一个问题,我被困在..
我必须使用C#代码转换字符串(来自某些外部源)..字符串可以具有这些预期的DateTime格式。
-
02/31/2009 01:59:59
24小时格式 -
02/31/2009 01:59:59 AM
12小时格式 -
2/31/2009 1:59:59
-
2/31/2009 1:59:59 AM
-
02/01/2009 01:59:59 AM
-
2/1/2009 1:59:59
- 等等 …….
我尝试使用DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
即,通过提取月,日等的值
但它不起作用..因为我不能完美地用子串提取值…因为字符串的长度是变化的
我也试图提取“/”,“ 空间 ”和“:”的出现值,但它变成瓶颈,导出(非)发生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
删除exception情况时,可以使用相同的function。 此外,与可空类型配对,这可以更清洁:
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 }
然后,您可以保留不同格式的列表,并尝试使用所有格式解析字符串,直到成功为止。
以下是所有可能的格式..
- MM / dd / yyyy 08/22/2006
- dddd,dd MMMM yyyy 2006年8月22日星期二
- dddd,dd MMMM yyyy HH:mm星期二,2006年8月22日06:30
- dddd,dd MMMM yyyy hh:mm tt星期二,2006年8月22日06:30 AM
- dddd,dd MMMM yyyy H:mm星期二,2006年8月22日6:30
- dddd,dd MMMM yyyy h:mm tt星期二,2006年8月22日上午6:30
- dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
- MM / dd / yyyy HH:mm 08/22/2006 06:30
- MM / dd / yyyy hh:mm tt 08/22/2006 06:30 AM
- MM / dd / yyyy H:mm 08/22/2006 6:30
- MM / dd / yyyy HH:mm:ss 08/22/2006 06:30:07
- MMMM dd 8月22日
- yyyy’ – ‘MM’ – ‘dd’T’HH’:’mm’:’ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
- ddd,dd MMM yyyy HH’:’mm’:’ss’GMT’Tue,2006年8月22日06:30:07 GMT
- yyyy’ – ‘MM’ – ‘dd’T’HH’:’mm’:’ss 2006-08-22T06:30:07
- HH:mm 06:30
- hh:mm tt 06:30 AM
- H:mm 6:30
- h:mm tt 6:30 AM
- HH:mm:ss 06:30:07
- yyyy’ – ‘MM’ – ‘dd HH’:’mm’:’ss’Z’2006-08-22 06:30:07Z
- dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
- 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格式参数