Getting all DateTimes between two 'DateTimes in C #

I have two DateTime s and I want to get all DateTime between these dates. For example, if my Dates are similar from 01/01/2010 - 01/05/2010, my function should return a list of dates (List) to me, and it should contain 01/01/2010, 01/02/2010, 01/03/2010, 01/04/2010, and 01/05/2010 .

I wrote such a function. It works great if my dates are per month. This will not work if my dates coincide from 01/01/2010 - 02/05/2010. Because the month has changed, and my function cannot handle it. Is there a function in C # that returns all dates between two dates? Or how can I handle month changes?

 public void GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate) { List<DateTime> allDates = new List<DateTime>(); int starting = startingDate.Day; int ending = endingDate.Day; for (int i = starting; i <= ending; i++) { allDates.Add(new DateTime(startingDate.Year, startingDate.Month, i)); } 

Question resolved; see Tim Robinson, simple answer to use.

+57
c # datetime
Jul 12 '10 at 11:11
source share
8 answers

You can use DateTime objects directly in a loop instead of your int . DateTime.AddDays handles the month correctly.

 for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1)) allDates.Add(date); 
+112
Jul 12 '10 at 11:15
source share
β€” -

How about something like that?

 public IEnumerable<DateTime> DateRange(DateTime fromDate, DateTime toDate) { return Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1) .Select(d => fromDate.AddDays(d)); } 

Edit: Tested now. :)

+51
Jul 12 '10 at 11:19
source share
 public IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate) { if (endingDate < startingDate) { throw new ArgumentException("endingDate should be after startingDate"); } var ts = endingDate - startingDate; for (int i = 0; i < ts.TotalDays; i++) { yield return startingDate.AddDays(i); } } 
+7
Jul 12 '10 at 11:17
source share

You were so close ... just don't use the day, use the whole date.

 static IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate) { List<DateTime> allDates = new List<DateTime>(); for (DateTime i = startingDate; i <= endingDate; i = i.AddDays(1)) { allDates.Add(i); } return allDates.AsReadOnly(); } 
+3
Jul 12 '10 at 11:18
source share

Here's a quick console application to demonstrate how to do this - use AddDays() instead:

 class Program { static void Main(string[] args) { GetDates(new DateTime(2010, 1, 1), new DateTime(2010, 2, 5)); Console.ReadKey(); } static List<DateTime> GetDates(DateTime startDate, DateTime endDate) { List<DateTime> dates = new List<DateTime>(); while ((startDate = startDate.AddDays(1)) < endDate) { dates.Add(startDate); } return dates; } } 
+1
Jul 12 '10 at 11:20
source share

Given the value of the lower value and the higher date value in String and the frequency as the third parameter, this method should return a date dictionary; where key is the initial value of the date range and value is the corresponding range. This works fine if the frequency is weekly or monthly - you can customize it according to your needs. The passed date values ​​must be in the correct format or you may need to format it using tryParseExact or something like that.

  protected static Dictionary<DateTime, String> getDateRange(String lowerDate, String higherDate, String frequency) { DateTime startDate, endDate; startDate = Convert.ToDateTime(lowerDate); endDate = Convert.ToDateTime(higherDate); Dictionary<DateTime, String> returnDict = new Dictionary<DateTime, String>(); while (frequency.Equals("weekly") ? (startDate.AddDays(7) <= endDate) : (startDate.AddMonths(1) <= endDate)) { if (frequency.Equals("weekly")) { returnDict.Add(startDate, startDate + "-" + startDate.AddDays(7)); startDate = startDate.AddDays(8); } if (frequency.Equals("monthly")) { returnDict.Add(startDate, startDate + "-" + startDate.AddMonths(1)); startDate = startDate.AddMonths(1).AddDays(1); } } returnDict.Add(startDate, startDate + "-" + endDate); return returnDict; } 
+1
Aug 30 '13 at 9:15
source share

Better decisions will fail if the date includes different hours. Here is a solution that gets all hours and all days:

All days:

 static public List<string> get_days_between_two_dates(DateTime start_date, DateTime end_date) { List<string> days_list = new List<string>(); DateTime temp_start; DateTime temp_end; //--Normalize dates by getting rid of minues since they will get in the way when doing the loop temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day); temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day); //--Example Should return //--1-12-2014 5:59AM - 1-13-2014 6:01AM return 12 and 13 for (DateTime date = temp_start; date <= temp_end; date = date.AddDays(1)) { days_list.Add(date.ToShortDateString()); } return days_list; } 

All hours:

 static public List<string> get_hours_between_two_dates(DateTime start_date, DateTime end_date) { List<string> hours_24_list = new List<string>(); DateTime temp_start; DateTime temp_end; //--Normalize dates by getting rid of minutes since they will get in the way when doing the loop temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day, start_date.Hour, 0, 0); temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day, end_date.Hour, 0, 0); //--Example Should return //--5:59AM - 6:01AM return 5am and 6am for (DateTime date = temp_start; date <= temp_end; date = date.AddHours(1)) { hours_24_list.Add(date.ToShortTimeString()); } return hours_24_list; } 
+1
Feb 18 '15 at 16:56
source share
 static IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate) { List<DateTime> allDates = new List<DateTime>(); for (DateTime i = startingDate; i <= endingDate; i = i.AddDays(1)) { allDates.Add(i); } return allDates.AsReadOnly(); } 
0
Nov 13 '15 at 12:14
source share



All Articles