Как получить список дат из диапазона дат? - PullRequest
1 голос
/ 31 июля 2011

У меня есть диапазон даты и времени:

var _checkInYear = (from d in db.bookings select d.checkinyear).ToList();
var _checkInMonth = (from d in db.bookings select d.checkinmonth).ToList();
var _checkInDay = (from d in db.bookings select d.checkinday).ToList();

var _checkOutYear = (from d in db.bookings select d.checkoutyear).ToList();
var _checkOutMonth = (from d in db.bookings select d.checkoutmonth).ToList();
var _checkOutDay = (from d in db.bookings select d.checkoutday).ToList();

Как мне получить список DateTime из этого диапазона? Например, если время заезда 20/08/2011, а время отъезда 23/08/2011, необходимо указать время в списке в этом диапазоне.

20.08.2011, 21.08.2011, 22.08.2011, 23.08.2011.

Ответы [ 5 ]

3 голосов
/ 31 июля 2011
DateTime checkIn = new DateTime(_checkInYear, _checkInMonth, _checkInDay);
DateTime checkOut = new DateTime(_checkOutYear, _checkOutMonth, _checkOutDay);

TimeSpan span = checkOut - checkIn;
List<DateTime> range = new List<DateTime>();
for(int day = 0; day <= span.Days; day++) 
{
    range.Add(checkIn.AddDays(day));
}

Пример: http://www.ideone.com/BxmkF

2 голосов
/ 31 июля 2011

Алгоритм прост, получите начальную точку, увеличивайте, пока не достигнете конечной точки.

var startDate = new DateTime(checkInYear, checkInMonth, checkInDay);
var endDate = new DateTime(checkOutYear, checkOutMonth, checkOutDay);
var givenDate = startDate; 
var datesInRange = new List<DateTime>(); 

while (givenDate <= startDate)
{
    datesInRange.Add(givenDate);
    givenDate = givenDate.AddDays(1);
}

// work with / return datesInRange
1 голос
/ 31 июля 2011

Если вы можете получить дату заезда и отъезда, то у вас может быть метод расширения для DateTime, чтобы получить список:

public static class ExtensionMethods
{
   static IEnumerable<DateTime> GetDateRange(this DateTime d, DateTime e)
   {
        var t=d;
        do
        {
            yield return t;
            t=t.AddDays(1);
        }while(t<e);
    }
}

Тогда используйте это так:

var dateList = checkIn.GetDateRange(checkOutDate);

Протестировано в Linqpad.

0 голосов
/ 21 февраля 2018

Немного старый вопрос, но я думаю, что мы должны сделать это:

DateTime checkIn = new DateTime(_checkInYear, _checkInMonth, _checkInDay);
DateTime checkOut = new DateTime(_checkOutYear, _checkOutMonth, _checkOutDay);
List<DateTime> allDates = new List<DateTime> ();

for (DateTime date = checkIn; date <= checkOut; date = date.AddDays(1))
    allDates.Add(date);
0 голосов
/ 31 июля 2011

Учитывая, что вы получите в свои руки два свидания, лучше всего просто использовать цикл for или while:

var dates = new List<DateTime>();
var curDate = booking.CheckinDate;
while (curDate <= booking.CheckoutDate)
{
    dates.Add(curDate);
    curDate = curDate.AddDays(1);
}

Однако я понимаю, что это может быть надуманным примером дляцели вопроса, но я обеспокоен тем, что ваш пример кода не будет делать то, что вы хотите.Не беспокойтесь о том, чтобы читать дальше, если это так, я просто хотел бы подчеркнуть это на случай, если вам будет лучше с чем-то вроде этого:

var booking = (from b in data.Bookings
               where b.BookingId = bookingId
               select new BookingSearchResult // You have to create this class
                          {
                              CheckinDate = new DateTime(b.CheckinYear, b.CheckinMonth, b.CheckinDay),
                              CheckoutDate = new DateTime(b.CheckoutYear, b.CheckoutMonth, b.CheckoutDay)
                          }).SingleOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...