我有以下代码列出两个日期之间每个月的最后一天但是我的问题是我没有得到几个月的最后一天。
例如:Date1: 31/10/2017 Date2: 31/3/2018
我的结果:
31-10-2017
30-11-2017
30-12-2017
30-1-2017
28-2-2018
28-3-2018
应该是
31-10-2017
30-11-2017
31-12-2017
31-1-2017
28-2-2018
31-3-2018
代码:
Dim startDay As Date = StartDate.SelectedDate
Dim endDay As Date = EndDate.SelectedDate
Dim dayCtr As Date
dayCtr = startDay
Do While (dayCtr <= endDay)
' MsgBox(dayCtr.Date.Day & "-" & dayCtr.Date.DayOfWeek.ToString())
ListBox1.Items.Add(dayCtr.Date.Day & "-" & dayCtr.Date.Month.ToString() & "-" & dayCtr.Date.Year.ToString())
dayCtr = dayCtr.AddMonths(1)
Loop
谢谢
addmonth(1)在日期的一个月组成部分中添加1个(并将其包裹在明年,因此您不必这样做),但其余的取决于您。
Private Function GetLastDayOfMonth(currentDate As Date) As Date
Dim result As Date
'Jump one Month ahead
result = currentDate.AddMonths(1)
'Go to first day of that Month
result = New Date(result.Year, result.Month, 1)
'Go one day back
result = result.AddDays(-1)
Return result
End Function
在您的代码中使用此功能:
Dim startDay As Date = StartDate.SelectedDate
Dim endDay As Date = EndDate.SelectedDate
Dim dayCtr As Date
dayCtr = startDay
Do While (dayCtr <= endDay)
' MsgBox(dayCtr.Date.Day & "-" & dayCtr.Date.DayOfWeek.ToString())
Dim lastDay As Date = GetLastDayOfMonth(dayCtr)
ListBox1.Items.Add(lastDay.Date.Day & "-" & lastDay.Date.Month.ToString() & "-" & lastDay.Date.Year.ToString())
dayCtr = dayCtr.AddMonths(1)
Loop
你应该没事的。。
通过使用Date.DaysInMonth
方法而无需额外操作
Private Iterator Function GetLastDatesFrom(startDate As Date,
endDate As Date) As IEnumerable(Of Date)
Dim temp = startDate
Do While (temp <= endDate)
Dim lastDay = Date.DaysInMonth(temp.Year, temp.Month)
Yield New Date(temp.Year, temp.Month, lastDay)
temp = temp.AddMonths(1)
Loop
End Function
然后
Dim startDay As Date = StartDate.SelectedDate
Dim endDay As Date = EndDate.SelectedDate
Dim dates = GetLastDatesFromRange(startDay, endDay).ToList()
ListBox1.Items.AddRange(dates)