Я делаю заявку. Приложение использует формат даты, такой как "2012-11-21 15:22:35"
.
Я уже знаю, что это формат "yyyy-MM-dd HH:mm:ss"
. Но как я могу программно найти формат даты и времени произвольной входной строки? Есть какой-либо способ сделать это?
Узнайте формат даты и времени строки даты в С#
Ответы (4)
Это может вам помочь.. (в массиве добавьте больше форматов для проверки)
string[] formats = {"M/d/yyyy", "MM/dd/yyyy",
"d/M/yyyy", "dd/MM/yyyy",
"yyyy/M/d", "yyyy/MM/dd",
"M-d-yyyy", "MM-dd-yyyy",
"d-M-yyyy", "dd-MM-yyyy",
"yyyy-M-d", "yyyy-MM-dd",
"M.d.yyyy", "MM.dd.yyyy",
"d.M.yyyy", "dd.MM.yyyy",
"yyyy.M.d", "yyyy.MM.dd",
"M,d,yyyy", "MM,dd,yyyy",
"d,M,yyyy", "dd,MM,yyyy",
"yyyy,M,d", "yyyy,MM,dd",
"M d yyyy", "MM dd yyyy",
"d M yyyy", "dd MM yyyy",
"yyyy M d", "yyyy MM dd"
};
DateTime dateValue;
foreach (string dateStringFormat in formats)
{
if (DateTime.TryParseExact(strDateTime, dateStringFormat,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dateValue))
//Console.WriteLine("Converted '{0}' to {1}.", dateStringFormat, dateValue.ToString("yyyy-MM-dd"));
Console.WriteLine( dateStringFormat);
}
Я думаю, вы столкнетесь с проблемами со строками даты, где значение месяца равно ‹= 12, так как это означает, что формат этой строки может быть "yyyy-MM-dd"
или "yyyy-dd-MM"
.
Невозможно узнать, какой из них правильный, если только вы не отдадите предпочтение своему синтаксическому анализатору.
Например: 2012/08/07
- "это может быть июль или август?"
Вы можете просто переборщить и надеяться, что культурная информация соответствует формату.
var datestring = "2012-10-05 12:00:03";
DateTime time;
var matchingCulture = CultureInfo.GetCultures(CultureTypes.AllCultures).FirstOrDefault(ci => DateTime.TryParse(datestring, ci, DateTimeStyles.None, out time))
Если вы хотите распознать формат, сделать это со 100% уверенностью практически невозможно. Однако вы можете просмотреть все форматы, поддерживаемые данными CultureInfo
и TryParse
ими. К сожалению, это может привести к неправильным результатам, так как невозможно сказать, что такое год, месяц и день, примерно так:
10/11/12
В зависимости от ваших культурных предубеждений вы можете интерпретировать это как 11 октября 2012 года; 10 ноября 2012 г. или 12 ноября 2010 г.
Вы не упомянули, что вы хотите сделать с датой, поэтому я дам вам только обычные рекомендации:
- Если вы хотите передавать даты между разными модулями приложения, используйте инвариантный формат даты.
- Если вам нужно отформатировать дату и время, используйте формат даты по умолчанию для данной культуры.
- Говоря о формате даты по умолчанию, если вы хотите принять дату, введенную конечным пользователем, вы можете проанализировать ввод в свободной форме в формате по умолчанию для культуры или создать (или использовать уже существующие) элементы управления выбором даты и времени. Последний способ предпочтительнее.
Объявление 1. Чтобы преобразовать в неизменный формат даты и времени, используйте:
DateTime now = DateTime.UtcNow;
string formatted = now.ToUniversalTime.ToString(CultureInfo.InvariantCulture);
или (для преобразования в формат, подобный ISO8601):
string formatted = now.ToString("u");
Точно так же вы можете анализировать DateTime из инвариантного формата:
DateTime result;
string source = "11/20/2012 11:22:33";
if (DateTime.TryParse(source, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out result))
{
// do something with result
}
или (универсальный формат не требует CultureInfo):
DateTime result;
string source = "2012-11-20 11:22:33Z";
if (DateTime.TryParse(source, out result))
{
// do something
}
Объявление 2 и 3. Форматирование и анализ для определенного языка и региональных параметров аналогичны форматированию и анализу инвариантных дат, но вам нужно заменить InvariantCulture обнаруженным конкретным экземпляром, скажем, CultureInfo.CurrentCulture
.
В зависимости от типа вашего приложения вы можете захотеть использовать специальный элемент управления календарем, например датчик пользовательского интерфейса jQuery.
Используйте приведенный ниже код:
строка sysFormat = CultureInfo.CurrentCulture.DateTimeFormat;