English 中文(简体)
我正在维护的VB.NET 2.0应用程序中发现的功能需要帮助
原标题:
  • 时间:2009-02-20 20:35:48
  •  标签:

我正在查看一些报告,应该显示为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
最佳回答

这是一些相当复杂的代码,实际上可以使用以下方式完成同样的事情:

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

那可能有点神秘,但它应该有效,并且可以扩展以获得更清晰的表达。

问题回答

为什么不使用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 (...)),但是我看到你原来的函数以格式化的字符串返回它,因此为了兼容性而保留它,以你原来的方式。

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

整个函数都不好:过于复杂,返回不正确的结果,没有指定返回类型,参数名称不仅具有类型前缀,而且前缀是错误的。

改为这样做:

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

此外,原始代码返回一个字符串,这是不合适的。该函数应该返回一个DateTime,并让调用它的函数处理适当的字符串转换。





相关问题
热门标签