ron*_*nag 5 c# datetime parsing format-string
我希望能够从DateTime字符串中获取格式字符串.
例如
"2012-12-08 15:00:00"=>"yyyy-MM-dd HH:mm:ss"
"2013/30/01 16:00"=>"yyyy/dd/MM HH:mm"
这可能吗?
这将是很难做到这一点在一个完全普遍的方式,但其中一个方案是提取相关DateTimeFormatInfo的是你感兴趣的(使用CultureInfo.DateTimeFormat),从提取特定的文化模式(LongDatePattern,LongTimePattern等),适当结合模式在某些情况下(例如ShortDatePattern空间ShortTimePattern),然后依次尝试每个模式DateTime.TryParseExact- 记住每次仍然指定文化,以便适当地处理日期分隔符等.
当DateTime.TryParseExact回报true,你知道你已经有了一个将解析给定的文本模式.
示例代码 - 包括显示您希望它可以工作的示例,但它不会:
using System;
using System.Collections.Generic;
using System.Globalization;
class Test
{
static void Main()
{
var us = new CultureInfo("en-US");
var uk = new CultureInfo("en-GB");
string text = "07/06/2013 11:22:11";
// This one fails, as there's no appropriate time format
Console.WriteLine(GuessPattern(text, us));
// This one prints dd/MM/yyyy HH:mm:ss
Console.WriteLine(GuessPattern(text, uk));
}
static string GuessPattern(string text, CultureInfo culture)
{
foreach (var pattern in GetDateTimePatterns(culture))
{
DateTime ignored;
if (DateTime.TryParseExact(text, pattern, culture,
DateTimeStyles.None, out ignored))
{
return pattern;
}
}
return null;
}
static IList<string> GetDateTimePatterns(CultureInfo culture)
{
var info = culture.DateTimeFormat;
return new string[]
{
info.FullDateTimePattern,
info.LongDatePattern,
info.LongTimePattern,
info.ShortDatePattern,
info.ShortTimePattern,
info.MonthDayPattern,
info.ShortDatePattern + " " + info.LongTimePattern,
info.ShortDatePattern + " " + info.ShortTimePattern,
info.YearMonthPattern
// Consider the sortable pattern, ISO-8601 etc
};
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会对您希望工作的某些"额外"日期和时间格式进行硬编码.
编辑:要处理歧义,您可以轻松地GuessPattern返回IEnumerable<string>而不是单个字符串:
static IEnumerable<string> GuessPatterns(string text, CultureInfo culture)
{
DateTime ignored;
return GetDateTimePatterns(culture)
.Where(pattern => DateTime.TryParseExact(text, pattern, culture,
DateTimeStyles.None, out ignored))
}
}
Run Code Online (Sandbox Code Playgroud)