Даты в For Loop в vb.net - PullRequest
       11

Даты в For Loop в vb.net

12 голосов
/ 26 августа 2009

В vb.net у меня есть два значения данных, как показано ниже:

Dim startp as datetime
Dim endp as datetime

У меня есть функция с именем ProcessData(soemdate), которая обрабатывает передачу данных.

В VB.net есть способ, которым я могу сделать что-то вроде

For each day between startp and endp
 ProcessData(soemdate)
Next 

Спасибо

Ответы [ 6 ]

25 голосов
/ 26 августа 2009

Вот еще один способ сделать это.

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
18 голосов
/ 26 августа 2009
For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days) _
                            .Select(Function(i) startp.AddDays(i)) 
    ProcessData(Day)
Next Day
9 голосов
/ 10 декабря 2014

Добавление к ответу Джоэла Кохорна, который я лично считаю, должно быть приемлемым ответом, поскольку я всегда стараюсь избегать циклов «В то время как независимо от того, насколько безопасными они могут быть». Для ... Каждый из них является гораздо более безопасным подходом, хотя перечисляемый не очень симпатичен. Однако вы можете переместить его в функцию, чтобы сделать вещи более читабельными, плюс вы можете использовать их по мере необходимости.

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

Я также добавил 1 к диапазону Enumerable, поскольку, как и у Джоэла, он не возвращал дату окончания, и в моей ситуации мне требовалось, чтобы он возвращал все даты в диапазоне, включая дни начала и окончания.

Enumerable.Range сам по себе является своего рода циклом, который добавляет i дней к начальной дате, увеличивая i с каждым вызовом, в данном случае от 0 до разницы между началом и концом дней + 1. Таким образом, при первом вызове вы получаете результат Start.AddDays (0), затем вы получите Start.AddDays (1) и т. д., пока диапазон не будет заполнен.

1 голос
/ 07 июня 2018

Вы можете легко циклически проходить каждый день, если преобразовать даты в 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
0 голосов
/ 11 мая 2012

Установить таблицу календаря со всеми датами и значениями запросов оттуда.

SQL:

Select Date as MyDate from tblCalendar Where Date >= StartDt And Date <= EndDate

.NET:

While Reader.read
  process(MyDate)
End While
0 голосов
/ 26 августа 2009

Да, вы можете использовать дату накопителя:

Dim Accumulator as DateTime
Accumulator = startp

While (Accumulator <= endp)


    Accumulator = Accumulator.AddDays(1)
End While

Не тестировался, и я программист на C #, так что будьте проще, если мой синтаксис неправильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...