C#: как преобразовать строку в DateTime, где строка может иметь любой стандартный формат datetime

я опубликовал вопрос о преобразовании DateTime в String, я получил много удовлетворительных ответов на это .. поэтому я очень благодарен StackOverflow ..
вот еще одна проблема манупуляции строк, с которой я застрял ..

Я должен преобразовать строку (от внешнего источника) с помощью кода C#.. строка может иметь ожидаемый формат DateTime ..

  1. 24 часа
  2. 02/31/2009 01:59:59 AM 12 часов формат
  3. 2/31/2009 1:59:59
  4. 2/31/2009 1:59:59 AM
  5. 02/01/2009 01:59:59 AM
  6. 2/1/2009 1:59:59
  7. и так далее .......

Я попытался с помощью 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
}

затем вы можете сохранить список различных форматов и попытаться проанализировать строку со всеми из них, пока не добьетесь успеха.


вот все возможные форматы ..

  1. MM/dd / гггг 08/22/2006
  2. dddd, DD MMMM гггг вторник, 22 Августа 2006 года
  3. dddd, dd MMMM гггг чч: мм вторник, 22 августа 2006 06:30
  4. дддд, ДД мммм гггг чч:мм ТТ Вторник, 22 августа 2006 06: 30--5-->
  5. dddd, dd MMMM гггг ч: мм вторник, 22 Август 2006 6:30
  6. dddd, dd MMMM гггг ч: мм ТТ вторник, 22 августа 2006 6: 30
  7. dddd, dd MMMM гггг чч:мм: СС Вторник, 22 Августа 2006 06: 30: 07
  8. ММ/ДД/гггг чч:мм 08/22/2006 06:30
  9. ММ/ДД/гггг чч:мм ТТ 08/22/2006 06:30 утра
  10. ММ / ДД / гггг ч: мм 08/22/2006 6: 30
  11. ММ/ДД/гггг чч:мм:СС 08/22/2006 06:30:07
  12. мммм ДД 22 августа
  13. гггг'-'ММ'-'ДД не 'чч':'мм':'СС.fffffffK 2006-08-22T06:30:07.7199222-04:00
  14. ddd, dd MMM yyyy HH': 'mm': 'SS ' GMT' ВТР, 22 Авг 2006 06: 30: 07 GMT
  15. гггг'-'ММ'-'ДД не 'чч':'мм':'СС 2006-08-22T06:30:07
  16. чч:мм 06:30
  17. hh: mm tt 06: 30 AM
  18. H: mm 6: 30
  19. h: mm tt 6: 30 AM
  20. чч:мм:СС 06:30:07
  21. yyyy' - 'MM'- 'dd HH': 'mm': 'ss'Z' 2006-08-22 06:30:07Z
  22. dddd, dd MMMM гггг чч:мм: СС Вторник, 22 Августа 2006 06: 30: 07
  23. гггг мммм 2006 август

DateTime dt1 = DateTime.Синтаксический анализ("2007/01/01 04:23:12", "гггг/ММ / ДД чч: мм: СС", Система.Глобализация.Свойство CultureInfo.CurrentCulture);

DateTime dt = конвертировать.ToDateTime("2007/01/01 04:23:12", Система.Глобализация.Свойство CultureInfo.CurrentCulture);