Как мне найти ближайшую действительную дату, указанную в качестве недопустимой строки даты? - PullRequest
3 голосов
/ 19 августа 2010

Эта проблема связана с пакетом учета, который выплевывает текстовые отчеты со строками данных с недопустимыми датами, такими как 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"

Это делает для меня грустный код, а мне грустный разработчик.

Я былпытаясь придумать более эффективный способ сделать это.Есть идеи?

РЕДАКТИРОВАТЬ :

Я нашел решение и опубликовал его, но мне больше понравился ответ Гуффы.

Ответы [ 2 ]

6 голосов
/ 19 августа 2010

Читая предыдущий код, последний код - это почти то, что я собирался предложить.

Вот вариант кода:

Return New DateTime(year, month, Math.Min(day, DateTime.DaysInMonth(year, month)))
0 голосов
/ 17 января 2017

Вот решение, которое я обнаружил до того, как ответил Гуффа.Он принимает части даты (месяц, день, год), использует количество дней в этой конкретной комбинации месяца / года для проверки части входящего дня и корректирует при необходимости перед построением нового DateTime.

Dim validDate As DateTime
Dim dayMax As Integer = DateTime.DaysInMonth(year, month)
Dim newDay = day

If day > dayMax OrElse day < 1 Then
    newDay = dayMax
End If

validDate = new DateTime(year, month, newDay)

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