оптимизация преобразования между строкой и дата


Мне было интересно, если существует более эффективный способ взятие струны, которые представляют даты во ммддгг или ММД ый или М д ый и превращая их в объект datetime?

111110 будет 11 11 10

111 10 будет 11 1 10

1 1 10 будет 1 1 10

Пробел или '' или '\0' (на входе мне дают не очень чистые)

Вот что у меня пока что работает во всех случаях.

//Converts a given input string into a valid date
private DateTime convertToDateFromString(string dateString)
{
  int length = dateString.Length;
  int month = 1;
  int day = 1;
  int year = 1;
  bool gotMonth = false;
  bool gotDay = false;
  bool gotYear = false;
  char c = ' ';
  char peek = ' ';
  string buffer = "";
  DateTime bufferDate;
  int count = 0;

  try
  {
    for (int i = 0; i < dateString.Length; i++)
    {
      c = dateString[i];
      if ((i + 1) < dateString.Length)
        peek = dateString[i + 1];
      else
        peek = '\0';

      if (c != ' ' && c != '\0')
      {
        buffer += c;
        count++;
        if ((peek == ' ' || peek == '\0' || count == 2) && gotMonth == false)
        {
          count = 0;
          gotMonth = true;
          month = int.Parse(buffer);
          buffer = null;
        }
        else if ((peek == ' ' || peek == '\0' || count == 2) && gotDay == false && gotMonth == true)
        {
          count = 0;
          gotDay = true;
          day = int.Parse(buffer);
          buffer = null;
        }
        else if ((peek == ' ' || peek == '\0' || count == 2) && gotYear == false && gotMonth == true && gotDay == true)
        {
          count = 0;
          gotYear = true;
          year = int.Parse(buffer);
          buffer = null;

          if (year >= 80 && year <= 99)
            year += 1900;
          else if (year >= 0 && year <= 79)
            year += 2000;
        }
      }
    }
    bufferDate = new DateTime(year, month, day);
  }
  catch (System.Exception ex)
  {
    bufferDate = new DateTime(1, 1, 1);
  }

  return bufferDate;
}


477
3
c#
задан 10 ноября 2011 в 09:11 Источник Поделиться
Комментарии
2 ответа

Вот один-лайнер для вас:

    private DateTime convertToDateFromString(string dateString)
{
DateTime bufferDate;

return DateTime.TryParseExact(
dateString,
new[] { "MMddyy", "MMd yy", "M d yy" },
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out bufferDate)
? bufferDate
: new DateTime(1, 1, 1);
}

С более чем одной строке:

    private DateTime convertToDateFromString(string dateString)
{
var allowedFormats = new[] { "MMddyy", "MMd yy", "M d yy" };
DateTime parsedDate;
var couldParse = DateTime.TryParseExact(
dateString,
allowedFormats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out parsedDate);

if (couldParse)
{
return parsedDate;
}

return new DateTime(1, 1, 1); // or throw an exception
}

5
ответ дан 10 ноября 2011 в 10:11 Источник Поделиться

Вот что я нашел после дополнительных исследований (переполнение стека)

private DateTime convertToDateFromString(string s)
{
string[] formats = new string[] { "MMddyy", "MMd yy", "M d yy" };
string dateString = s.Replace('\0', ' ');
dateString = dateString.Trim();

int spaces = dateString.Count(c => c == ' ');
DateTime date = DateTime.ParseExact(dateString, formats[spaces], null);

return date;
}

https://stackoverflow.com/questions/8086726/converting-a-string-to-a-date-in-c-sharp/8086902#8086902

1
ответ дан 11 ноября 2011 в 02:11 Источник Поделиться