我在DateTime上发布了一个关于String转换的问题,我得到了很多令人满意的答案..所以我非常感谢StackOverflow ..这是String manupulation的另一个问题,我被困住了……我必须转换一个字符串(从一些外部来源)使用C#代码..字符串可以具有这些预期格式的DateTime ..
> 02/31/2009 01:59:59 24小时格式
> 02/31/2009 01:59:59 AM 12小时格式
> 2009年2月31日1:59:59
> 2009年2月31日上午1:59:59
> 02/01/2009 01:59:59 AM
> 2009年2月1日1:59:59
>等等…….
我尝试使用DateTime(Convert.ToInt32(string_date.Substring(6,4)),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时可以使用相同的功能来删除异常情况.此外,与可空类型配对,这可以更清洁:
private static DateTime? ParseDate(string input) { DateTime result; if (DateTime.TryParseExact(input,DateTimeStyles.None,out result)) { return result; } return null; }
现在,如果它无法解析输入,它将只返回一个空引用.