Мне было интересно, есть ли способ извлечь формат DateTime из заданной строки даты. В C# Например:
var dateString = "12/10/2018";
var format = GetDateFormat(dateString);
а затем формат будет похож на «длинное время» или что-то в этом роде.





Вы можете попробовать DateTime.TryParseExact с набором предопределенных форматов. Соответствующие будут форматами, которые вы ищете.
Это не сработает, поскольку есть неоднозначные возможности
Двусмысленность - это часть вопроса, а не ответ;)
С помощью жесткого кодирования или отражения (показано ниже) вы можете получить значение всех свойства класса DateTimeFormatInfo, имена которых заканчиваются на "Pattern", затем попытаться выполнить синтаксический анализ с использованием этих шаблонов и посмотреть, какие из них успешны. Затем вы ограничены шаблонами, предоставляемыми этим классом, и какой бы культурой (культурами) вы не воспользовались.
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
Нет встроенной функции или чего-то еще, но вы можете написать ее самостоятельно. Вот небольшой пример, который проверяет наличие трех возможных форматов; вы можете добавить столько, сколько захотите, просто добавив их в список.
Если вам нужно поддерживать необычные форматы (например, форматы, которые не могут быть автоматически обнаружены 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'
Его нет, по крайней мере, встроенного. Почему? Поскольку
12/10/2018может бытьdd/MM/yyyyиMM/dd/yyyy