我想知道是否有办法从给定的日期字符串中提取DateTime格式。在C#中 例如:
var dateString = "12/10/2018";
var format = GetDateFormat(dateString);
然后格式就像'长日期'或其他什么。
答案 0 :(得分:1)
通过硬编码或反射(如下所示),您可以检索名称以"Pattern"
结尾的所有properties of the DateTimeFormatInfo
class的值,然后尝试使用这些模式进行解析并查看哪些模式成功。然后,您将被限制为该类提供的模式以及您选择使用的任何文化。
DateTimeFormatInfo formatInfo = DateTimeFormatInfo.CurrentInfo;
IEnumerable<PropertyInfo> patternProperties = formatInfo.GetType().GetProperties()
.Where(property => property.Name.EndsWith("Pattern"));
foreach (PropertyInfo patternProperty in patternProperties)
{
string pattern = (string) patternProperty.GetValue(formatInfo);
bool wasParsed = DateTime.TryParseExact(dateString, pattern, formatInfo, DateTimeStyles.None, out DateTime _);
Console.WriteLine($"{patternProperty.Name} (\"{pattern}\"): {wasParsed}");
}
在我的系统(en-US)上,上面的代码产生以下输出:
FullDateTimePattern ("dddd, MMMM d, yyyy h:mm:ss tt"): False
LongDatePattern ("dddd, MMMM d, yyyy"): False
LongTimePattern ("h:mm:ss tt"): False
MonthDayPattern ("MMMM d"): False
RFC1123Pattern ("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"): False
ShortDatePattern ("M/d/yyyy"): True
ShortTimePattern ("h:mm tt"): False
SortableDateTimePattern ("yyyy'-'MM'-'dd'T'HH':'mm':'ss"): False
UniversalSortableDateTimePattern ("yyyy'-'MM'-'dd HH':'mm':'ss'Z'"): False
YearMonthPattern ("MMMM yyyy"): False
答案 1 :(得分:0)
您可以使用一组预定义格式尝试DateTime.TryParseExact
。那些匹配的将是您正在寻找的格式。
答案 2 :(得分:0)
没有内置功能或任何东西,但你可以自己写一个。这是一个简短的例子,它检查三种可能的格式;只需添加到列表中,您就可以添加更多内容。
如果您需要支持不寻常的格式(例如DateTime.Parse()
无法自动检测的格式,那么您可能需要使用DateTime.ParseExact()
测试输入的稍微不同的解决方案,例如BACON&回答。
public class Program
{
//Returns a string indicating the format of the input, or null if could not be detected
public static string GetDateTimeFormatCode(string dateTimeString)
{
//Parse the input
DateTime dateTime;
if (!DateTime.TryParse(dateTimeString, out dateTime)) return null;
return
(
new string[]
{
"M/d/yyyy",
"d MMM yyyy",
"d MMMM yyyy",
"dddd MMMM d yyyy"
}
)
.Where( c => dateTime.ToString(c) == dateTimeString )
.FirstOrDefault();
}
public static void Main()
{
var tests = new List<string>
{
@"21 May 2018",
@"6/21/2018",
@"Monday May 21 2018"
};
foreach (var t in tests)
{
Console.WriteLine("Input '{0}' uses format '{1}'", t, GetDateTimeFormatCode(t) ?? "?");
}
}
}
输出:
Input '21 May 2018' uses format 'd MMM yyyy'
Input '6/21/2018' uses format 'M/d/yyyy'
Input 'Monday May 21 2018' uses format 'dddd MMMM d yyyy'