我希望能够从 DateTime 字符串中获取格式字符串。
例如
"2012-12-08 15:00:00" => "yyyy-MM-dd HH:mm:ss"
"2013/30/01 16:00" => "yyyy/dd/MM HH:mm"
这可能吗?
我希望能够从 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
space 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
};
}
}
您可能会硬编码一些您希望工作的“额外”日期和时间格式。
编辑:要处理歧义,您可以轻松地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))
}
}
您可以拥有一组预定义的格式并解析日期并查看它是否通过,然后您可以获得您正在寻找的字符串格式。
请参阅答案,但它在 java 中 -如何在 java 中获取给定的日期字符串格式(模式)?
我和 Jon Skeet 有同样的想法并去实现它:
// Helper method
IEnumerable<string> DateTimeFormatPatterns(DateTimeFormatInfo format)
{
var accessors = new Func<DateTimeFormatInfo, string>[]
{
f => f.FullDateTimePattern,
f => f.LongDatePattern,
f => f.LongTimePattern,
f => f.MonthDayPattern,
f => f.ShortDatePattern,
f => f.SortableDateTimePattern,
f => f.UniversalSortableDateTimePattern,
f => f.YearMonthPattern,
};
return accessors.Select(accessor => accessor(format));
}
// The real function
string DetectDateTimeFormat(string date, CultureInfo culture)
{
DateTime dummy;
foreach (var pattern in DateTimeFormatPatterns(culture.DateTimeFormat))
{
if (DateTime.TryParseExact(date, pattern, culture,
DateTimeStyles.None, out dummy))
{
return pattern;
}
}
return null;
}
这里有改进的空间(例如,硬编码DateTimeStyles.None
没有帮助,假设当前文化的重载也是有用的),但你可以像这样使用它:
var format = DetectDateTimeFormat("2012-12-08 15:00:00",
CultureInfo.CurrentCulture);
您可以尝试通过编写以下代码来获取yyyy/dd/MM HH:mm
格式。
DateTimeFormatInfo df1 = new DateTimeFormatInfo();
df1.SortTimePattern();
它会给你相同HH:mm
的格式。