TryParse datetime из элементов невидимого времени - PullRequest
1 голос
/ 06 июля 2011

Мне нужно проверить, что определенные переменные могут создавать допустимое время и, если это так, заставить его игнорировать его, не выдавая исключение.

У меня есть следующий код

 int y, m, d, h, mi, s, tz;
ogrFeature.GetFieldAsDateTime(field, out y, out m, out d, out h, out mi, out s, out tz);
fdr[fdrIndex++] = new DateTime(y, m, d, h, mi, s);

Намомент, когда построение даты и времени завершится неудачей, если (из MSDN)

год меньше 1 или больше, чем> 9999.

месяц меньше 1 или больше, чем> 12.

день меньше 1 или больше, чем> количество дней в месяце.

час меньше 0 или больше> 23.

минута меньше, чем0 или больше> 59.

секунда меньше 0 или больше> 59.

миллисекунда меньше 0 или больше> 999.

Я просмотрел, и, кажется, нет никаких конкретных методов для проверки этого типа ввода.

Есть хороший способ проверить этот ввод без необходимости иметь целую кучу ifs илиобернуть его в неприятную попытку / поймать и поймать ArgumentOutOfRangeException?

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Вы можете использовать этот метод:

public static DateTime? GetFieldAsDateTime(int y, int m, int d, 
    int h, int mi, int s)
{
    DateTime result;
    var input = 
        string.Format("{0:000#}-{1:0#}-{2:0#}T{3:0#}:{4:0#}:{5:0#}", 
        y, m, d, h, mi, s);

    if (DateTime.TryParse(input, CultureInfo.InvariantCulture, 
        System.Globalization.DateTimeStyles.RoundtripKind, out result))
    {
        return result;
    }

    return null;
}
1 голос
/ 06 июля 2011

Мне было очень весело придумать ответ на этот вопрос! Я думаю, что это получилось довольно аккуратно, потому что он проверяет ввод, возвращает истинное значение, которое вы можете легко использовать, или удобочитаемое сообщение об ошибке. Кроме того, с помощью одного простого оператора if вы можете выполнить свой код или сделать что-то с ошибкой. Настройте это так, как считаете нужным (т.е. рефакторинг в метод), если это не сработает для вас или не соответствует вашим потребностям, я мог бы попробовать что-то еще, так как я думал, что это интересная проблема. По сути, идея заключается в том, что для каждого условия, которое возвращает true, мы просто переходим к следующему условию, пока больше нет условий для проверки, а затем возвращаем Boolean.TrueString, который можно использовать для некоторой проверки.

int y, m, d, h, mi, s, tz;
ogrFeature.GetFieldAsDateTime(field, out y, out m, out d, out h, out mi, out s, out tz);

string error = 
      (y < 1 || y > 9999) 
    ? (m < 1 || m > 12) 
    ? (d < 1 || d > 31) 
    ? (h < 0 || h > 23) 
    ? (m < 0 || m > 59) 
    ? (s < 0 || s > 59) 
    ? (tz < 0 || tz > 999) 
    ? Boolean.TrueString // All conditions have passed validation. Return "True".
    : "Year is less than 1 or greater than > 9999."
    : "Month is less than 1 or greater than > 12."
    : "Day is less than 1 or greater than the > number of days in month."
    : "Hour is less than 0 or greater than > 23."
    : "Minute is less than 0 or greater than > 59."
    : "Second is less than 0 or greater than > 59."
    : "Millisecond is less than 0 or greater > than 999.";

if (error == bool.TrueString) {
    fdr[fdrIndex++] = new DateTime(y, m, d, h, mi, s);
}
else {
    // Display error, for example:
    // ie.
    MessageBox.Show(error, "Incorrect Date Format", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
1 голос
/ 06 июля 2011

Вы приблизились к правильному ответу: шаблон TryParse.

public static bool TryCreateDateTime(int y, int m, int d, int h, int mi, int s, 
    out DateTime dt){
  int[] normalDays={0,31,28,31,30,31,30,31,31,30,31,30,31};
  int[] leapDays  ={0,31,29,31,30,31,30,31,31,30,31,30,31};
  dt=DateTime.MinValue;
  if(y>=1 && y<=9999 &&
    m>=1 && m<=12 &&
    d>=1 && d<=(DateTime.IsLeapYear(y) ? leapDays : normalDays)[m] &&
    h>=0 && h<=23 &&
    mi>=0 && mi<=59 && s>=0 && s<=59){
    dt=new DateTime(y,m,d,h,mi,s);
    return true;
  }
  return false;
}

Возвращает истину, если ввод верен, ложь в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...