Эта проблема связана с пакетом учета, который выплевывает текстовые отчеты со строками данных с недопустимыми датами, такими как 31 февраля день или 31 сентября день .
Отчеты форматируются пробелами и моноширинными шрифтами.Моя цель - проанализировать необходимые данные и создать более формальный отчет (SSRS).
Что меня интересует, так это исправление ситуации, когда дата недействительна и не может быть напрямую преобразована в * 1009.* структура.Формат даты из отчета MMM-dd-yy
(например, Feb-30-10
). Я хотел бы преобразовать недопустимые строки даты в ближайшую действительную DateTime
в том же месяце , прежде чем показывать их в формальном отчете.Я видел, как это делалось двумя способами в мое время как разработчик, оба очень плохо, поэтому я хочу придумать простой способ сделать это (если нет встроенного способа, о котором я не знаю).
Первый плохой метод, который я видел (я не могу поверить, что даже показываю вам!):
Dim month As Integer = <Parse out the month from the bad date string>
Dim day As Integer = <Parse out the day from the bad date string>
Dim year As Integer = <Parse out the year from the bad date string>
Dim validDate As DateTime
While True
Try
validDate = New DateTime(year, month, day)
Exit While
Catch ex As ArgumentOutOfRangeException
day -= 1
End Try
End While
Надеюсь, мне не нужно объяснять, что яМне не нравится этот метод.
Второй плохой метод:
Dim badDateString As String = <Current date string from text report>
Dim validDate As DateTime
If DateTime.TryParseExact(badDateString, "MMM-dd-yy", Nothing, Globalization.DateTimeStyles.None, validDate) Then
Return validDate
End If
badDateString = badDateString.Replace("31", "30")
' ... try the parse again, if still not valid, replace "30" with "29"
' ... try the parse again, if still not valid, replace "29" with "28"
Это делает для меня грустный код, а мне грустный разработчик.
Я былпытаясь придумать более эффективный способ сделать это.Есть идеи?
РЕДАКТИРОВАТЬ :
Я нашел решение и опубликовал его, но мне больше понравился ответ Гуффы.