在vb.net中,我有两个数据值,如下所示:
Dim startp as datetime
Dim endp as datetime
我有一个名为ProcessData(soemdate)
的函数来处理数据操作。
在VB.net中我有办法做一些像
这样的事情For each day between startp and endp
ProcessData(soemdate)
Next
由于
答案 0 :(得分:25)
这是另一种方法。
Dim startP As DateTime = New DateTime(2009, 1, 1)
Dim endP As DateTime = New DateTime(2009, 2, 1)
Dim CurrD As DateTime = startP
While (CurrD <= endP)
ProcessData(CurrD)
Console.WriteLine(CurrD.ToShortDateString)
CurrD = CurrD.AddDays(1)
End While
答案 1 :(得分:18)
For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days) _
.Select(Function(i) startp.AddDays(i))
ProcessData(Day)
Next Day
答案 2 :(得分:9)
添加Joel Coehoorn的答案,我个人认为应该是接受的答案,因为我总是尽量避免使用While循环而不管它们的安全性如何。对于...每个都是一个更安全的方法,虽然可枚举的内联不是很漂亮。但是,您可以将其移动到一个函数以使事物更具可读性,并且可以根据需要重新使用。
For Each Day As DateTime In DateRange(StartDate, EndDate)
ProcessData(Day)
Console.WriteLine(Day.ToShortDateString)
Next
Public Shared Function DateRange(Start As DateTime, Thru As DateTime) As IEnumerable(Of Date)
Return Enumerable.Range(0, (Thru.Date - Start.Date).Days + 1).Select(Function(i) Start.AddDays(i))
End Function
我还在Enumerable系列中添加了1,因为Joel拥有它,它不会返回结束日期,在我的情况下,我需要它返回范围内的所有日期,包括开始和结束日期。
Enumerable.Range本身就是一种循环,它将i天添加到startdate中,每次调用都会推进i,在这种情况下为0,开始日和结束日之间的差异为1.因此,第一次调用它时,你得到了Start.AddDays(0)的结果,接下来你将获得Start.AddDays(1),依此类推,直到范围完成。
答案 3 :(得分:1)
如果您将日期转换为 OLE Automation Date OADate
,您可以轻松遍历每一天,其中左侧部分代表日期,右侧部分代表时间。
例如#06/19/2018#.ToOADate
转换为43270.0
For loopDate As Double = #06/19/2018#.ToOADate To #07/01/2018#.ToOADate
Dim thisDate As Date = DateTime.FromOADate(loopDate)
' Do your stuff here e.g. ProcessData(thisDate)
Next
答案 4 :(得分:0)
是的,您可以使用累加器日期:
Dim Accumulator as DateTime
Accumulator = startp
While (Accumulator <= endp)
Accumulator = Accumulator.AddDays(1)
End While
没有经过测试,而且我是C#程序员,所以如果我的语法错误就很容易。
答案 5 :(得分:-1)
设置一个包含所有日期和查询值的日历表。
SQL:
Select Date as MyDate from tblCalendar Where Date >= StartDt And Date <= EndDate
.NET:
While Reader.read
process(MyDate)
End While