我正在阅读本应该显示的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("") End Try End Function
Daniel LeChe.. 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本身(通过更改返回类型和nixing .ToString(...)
),但我看到您的原始函数将其作为格式化字符串返回,因此为了兼容性目的,我保持了它的方式你有它.
为什么不用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本身(通过更改返回类型和nixing .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,并让调用它的函数处理相应的字符串转换.