C#: как преобразовать строку в DateTime, где строка может иметь любой стандартный формат datetime
я опубликовал вопрос о преобразовании DateTime в String, я получил много удовлетворительных ответов на это .. поэтому я очень благодарен StackOverflow ..
вот еще одна проблема манупуляции строк, с которой я застрял ..
Я должен преобразовать строку (от внешнего источника) с помощью кода C#.. строка может иметь ожидаемый формат DateTime ..
- 24 часа
-
02/31/2009 01:59:59 AM
12 часов формат 2/31/2009 1:59:59
2/31/2009 1:59:59 AM
02/01/2009 01:59:59 AM
-
2/1/2009 1:59:59
- и так далее .......
Я попытался с помощью DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
ie, извлекая значения месяца, дня и т. д.
но это не работает .. потому что я не могу извлечь значения с подстрокой идеально .. как длина строки различные
Я также попытался извлечь значения ссылаясь на возникновение"/","пробел "и": "но это становится горлышко бутылки, чтобы получить с (не-)возникновением AM/PM
только длина дня, месяца и часов может варьироваться ..
4 ответов
можно использовать DateTime.ParseExact
перегрузка, которая принимает список форматов:
private static string[] formats = new string[]
{
"MM/dd/yyyy HH:mm:ss tt",
"MM/dd/yyyy HH:mm:ss",
"M/dd/yyyy H:mm:ss tt",
"M/dd/yyyy H:mm:ss"
};
private static DateTime ParseDate(string input)
{
return DateTime.ParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
}
это бросит FormatException
если переданная строка не соответствует ни одному из заданных форматов. Обратите внимание, что форматы, ожидающие AM / PM, должны отображаться перед идентичными форматами без AM / PM ("MM/dd/yyyy HH:mm:ss tt"
перед "MM/dd/yyyy HH:mm:ss"
).
обновление
As Хенк указывает в комментариях, та же функциональность доступна при использовании TryParseExact
, который удаляет ситуация исключения. Кроме того, в паре с nullable типами это можно сделать немного чище:
private static DateTime? ParseDate(string input)
{
DateTime result;
if (DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
{
return result;
}
return null;
}
теперь он просто вернет нулевую ссылку, если он не сможет проанализировать входные данные.
посмотри метод tryparseexact метод. Вот пример с первым случаем:
DateTime date;
// I changed 02/31/2009 to 01/31/2009 because the first is not a valid date
if (DateTime.TryParseExact("01/31/2009 01:59:59", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out date))
{
// string successfully parsed => do something with the date
}
затем вы можете сохранить список различных форматов и попытаться проанализировать строку со всеми из них, пока не добьетесь успеха.
вот все возможные форматы ..
- MM/dd / гггг 08/22/2006
- dddd, DD MMMM гггг вторник, 22 Августа 2006 года
- dddd, dd MMMM гггг чч: мм вторник, 22 августа 2006 06:30
- дддд, ДД мммм гггг чч:мм ТТ Вторник, 22 августа 2006 06: 30--5-->
- dddd, dd MMMM гггг ч: мм вторник, 22 Август 2006 6:30
- dddd, dd MMMM гггг ч: мм ТТ вторник, 22 августа 2006 6: 30
- dddd, dd MMMM гггг чч:мм: СС Вторник, 22 Августа 2006 06: 30: 07
- ММ/ДД/гггг чч:мм 08/22/2006 06:30
- ММ/ДД/гггг чч:мм ТТ 08/22/2006 06:30 утра
- ММ / ДД / гггг ч: мм 08/22/2006 6: 30
- ММ/ДД/гггг чч:мм:СС 08/22/2006 06:30:07
- мммм ДД 22 августа
- гггг'-'ММ'-'ДД не 'чч':'мм':'СС.fffffffK 2006-08-22T06:30:07.7199222-04:00
- ddd, dd MMM yyyy HH': 'mm': 'SS ' GMT' ВТР, 22 Авг 2006 06: 30: 07 GMT
- гггг'-'ММ'-'ДД не 'чч':'мм':'СС 2006-08-22T06:30:07
- чч:мм 06:30
- hh: mm tt 06: 30 AM
- H: mm 6: 30
- h: mm tt 6: 30 AM
- чч:мм:СС 06:30:07
- yyyy' - 'MM'- 'dd HH': 'mm': 'ss'Z' 2006-08-22 06:30:07Z
- dddd, dd MMMM гггг чч:мм: СС Вторник, 22 Августа 2006 06: 30: 07
- гггг мммм 2006 август
DateTime dt1 = DateTime.Синтаксический анализ("2007/01/01 04:23:12", "гггг/ММ / ДД чч: мм: СС", Система.Глобализация.Свойство CultureInfo.CurrentCulture);
DateTime dt = конвертировать.ToDateTime("2007/01/01 04:23:12", Система.Глобализация.Свойство CultureInfo.CurrentCulture);