我希望能够从日期字符串得到的格式字符串
I would like to be able to get the format string from a DateTime string.
例如
2012年12月8日15时零零分00秒=>YYYY-MM-DD HH:MM:SS
"2012-12-08 15:00:00" => "yyyy-MM-dd HH:mm:ss"
2013/30/01 16:00=>YYYY / DD / MM HH:MM
"2013/30/01 16:00" => "yyyy/dd/MM HH:mm"
这可能吗?
推荐答案这将是很难做到这一点在一个完全普遍的方式,但其中一个方案是提取相关 的DateTimeFormatInfo 请将CultureInfo.DateTimeFormat ),从( LongDatePattern , LongTimePattern 等),结合图案适当地在某些情况下(如 ShortDatePattern 空间 ShortTimePattern ),然后使用 DateTime.TryParseExact 依次尝试每个模式 - 记住每次还指定文化,以处理日期分隔等适当
It would be very hard to do this in a completely general way, but one option would be to extract the relevant DateTimeFormatInfo that you're interested in (using CultureInfo.DateTimeFormat), extract the culture-specific patterns from that (LongDatePattern, LongTimePattern etc), combine the patterns appropriately in some cases (e.g. ShortDatePattern space ShortTimePattern) and then try each pattern in turn using DateTime.TryParseExact - remembering to still specify the culture each time in order to handle date separators etc appropriately.
在 DateTime.TryParseExact 收益真正,你知道你已经得到的在的格局,这将解析给定文本
When DateTime.TryParseExact returns true, you know you've got a pattern which will parse the given text.
示例代码 - 包括显示在你期望它的工作,但它没有一个例子:
Sample code - including showing an example where you'd expect it to work but it doesn't:
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 }; } }您可能会硬编码了一些额外的日期以及你期望的工作时间格式
You could potentially hard-code some "extra" date and time formats which you expect to work.
编辑:要处理歧义,你可以很容易地使 GuessPattern 返回的IEnumerable<串> ,而不是一个字符串:
To handle ambiguity, you could easily make GuessPattern return an IEnumerable<string> instead of a single 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)) } }更多推荐
解析DateTime格式得到格式字符串
发布评论