帮助我在我维护的VB.NET 2.0应用程序中找到的功能

时间:2009-02-20 20:35:48

标签: vb.net

我正在阅读一些本应显示2/1/2009 - 2/28/2009的报告,而是显示2/1/2009 - 3/1/2009。我已经将错误缩小到这个代码,任何建议?

Function GetMonthLastDate(ByVal sDateTime As DateTime)
    Try
        Dim strArrMonth() As String = {"", "31", "29", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31"}
        Dim days As Integer
        If sDateTime.Month = 2 Then
            If sDateTime.Year Mod 400 = 0 Then Return sDateTime.AddDays(28)
            If sDateTime.Year Mod 100 = 0 Then Return sDateTime.AddDays(27)
            If sDateTime.Year Mod 4 = 0 Then Return sDateTime.AddDays(28)
        End If
        days = strArrMonth(sDateTime.Month)
        Return Format(sDateTime.AddDays(days - 1), "MM/dd/yyyy")
    Catch ex As Exception
        Response.Write("<script>alert('" & ex.Message & "');</script>")
    End Try
End Function

3 个答案:

答案 0 :(得分:7)

为什么不使用DateTime.DaysInMonth?它使代码更多更清晰。

Function GetMonthLastDate(ByVal srcDate As DateTime) As String
    return _
       new DateTime(srcDate.Year, srcDate.Month, _
                    DateTime.DaysInMonth(srcDate.Year, srcDate.Month)) _
           .ToString("MM/dd/yyyy")
End Function

你可以很容易地(也可能应该)返回DateTime本身(通过更改返回类型并修改.ToString(...)),但是我看到你的原始函数将它作为格式化字符串返回,所以为了兼容性目的我保持它的方式。

答案 1 :(得分:6)

在查找数组中,索引2(值为29)仅适用于闰年。

整个函数都很糟糕:它过于复杂,返回错误的结果,没有指定返回类型,并且不仅在参数名称上有类型前缀,而且它是错误的前缀。

请改为:

Function GetLastMonthDate(ByVal dtDateTime As DateTime) As DateTime
    Return dtDateTime.AddDays(DateTime.DaysInMonth(dtDateTime.Year, dtDateTime.Month)-dtDateTime.Day)
End Function

除此之外,它看起来原始返回一个字符串,这实际上是不合适的。此函数应返回DateTime,并让调用它的函数处理相应的字符串转换。

答案 2 :(得分:4)

对于它正在做的事情,这是一些非常复杂的代码。你可以完成同样的事情:

Function GetMonthLastDate(ByVal sDateTime As DateTime)
  Dim nextMonth As DateTime = sDateTime.AddMonths(1)
  Return New DateTime(nextMonth.YearPart, nextMonth.MonthPart, 1).AddDays(-1)
End Function

这可能有点神秘,但它应该有效并且可以扩展以便清晰。