试图在一年内列出所有星期一和他们的日期

时间:2014-05-09 15:19:20

标签: vb.net date

我正在尝试列出所有星期一和他们的日期,比方说,2014年。我不知道下面的代码有什么问题(可能是循环)。当我执行这些程序时,程序崩溃。

    Dim d1 As DateTime = #1/1/2014#
    Dim d2 As DateTime = d1.AddDays(-(d1.DayOfWeek - DayOfWeek.Monday))

    Do
        ListBox1.Items.Add(d2.ToString("MMM - dd - yyyy   ddd"))
        d2.AddDays(7)
    Loop While (d2.Year < 2015)

4 个答案:

答案 0 :(得分:5)

DateTime实例是不可变的,这意味着它无法更改。 d2.AddDays(7)表达式会创建一个具有不同值的 new 实例,您可以将其分配回d2

d2 = d2.AddDays(7)

那为什么你的程序会崩溃?由于日期永远不会改变,因此它永远不会达到2015年,并且您的程序将尝试向列表框添加无限多个项目。显然,在发生这种情况之前你会耗尽内存,这会导致程序崩溃。

答案 1 :(得分:1)

您需要将AddDays中的值重新分配给用于测试存在条件的变量

 d2 = d2.AddDays(7)

如果没有这个,循环永远不会结束,因为永远不会满足退出条件。

查看MSDN documentation

  

返回一个新的DateTime,它将指定的天数添加到   此实例的值

顺便说一句,您的代码还列出了2013年的日期,我建议首先将初始值设置为

Dim d1 As DateTime = #1/7/2014#

答案 2 :(得分:1)

这是一个可能适合您的方法:

Private Function GetAllWeekdays(inYear As Integer, dayOfWeek As System.DayOfWeek) As List(Of Date)
    Dim currDate As New Date(inYear, 1, 1) 'start jan 1st
    GetAllWeekdays = New List(Of Date)

    For i = 1 To (New Date(inYear, 12, 31) - New Date(inYear, 1, 1)).Days
        currDate = currDate.AddDays(1)
        If (currDate.DayOfWeek = dayOfWeek) Then GetAllWeekdays.Add(currDate)
    Next
End Function

它会循环显示所提供年份中的所有日期,并仅返回您提供的System.DayOfWeek天数。

你可以像这样使用它:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Me.ListBox1.DataSource = GetAllWeekdays(2014, DayOfWeek.Monday)
End Sub

答案 3 :(得分:1)

使用迭代器块怎么样?

Private Iterator Function DateSequence( _
        start As DateTime, _
        step As TimeSpan) As IEnumerable(Of DateTime)

    While True
        start = start.Add(step)
        Yield start
    End While
End Function

允许你做一些linq,

Dim firstDay = 'excercise for reader
Dim step = TimeSpan.FromDays(7)
var days = DateSequence(firstDay, step).Take(53) _
        .Where(Function(d) d.Year = firstDay.Year)