我在DateTime上发布了一个关于字符串转换的问题,我得到了很多令人满意的答案..所以我非常感谢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
只有日,月和小时的长度可以变化。 。
答案 0 :(得分:23)
您可以使用带有格式列表的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;
}
现在,如果它无法解析输入,它将只返回一个空引用。
答案 1 :(得分:7)
查看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
}
然后,您可以保留不同格式的列表,并尝试使用所有格式解析字符串,直到成功为止。
答案 2 :(得分:2)
以下是所有可能的格式..
- MM / dd / yyyy 08/22/2006
- dddd,dd MMMM yyyy 22日周二 2006年8月
- dddd,dd MMMM yyyy HH:mm星期二, 2006年8月22日06:30
- dddd,dd MMMM yyyy hh:mm tt 2006年8月22日星期二上午06:30
- dddd,dd MMMM yyyy H:mm星期二,22 2006年8月6:30
- dddd,dd MMMM yyyy h:mm tt Tuesday, 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 6点30分07秒
- MMMM dd 8月22日
- YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
- ddd,dd MMM yyyy HH':'mm':'ss'GMT' 2006年8月22日星期二06:30:07 GMT
- YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' 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月
醇>
答案 3 :(得分:0)
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 格式参数