在C#中的两个DateTime之间获取所有DateTime
我有两个DateTime
,我想在这些date之间获得所有date时间。 例如,如果我的date类似01.01.2010 – 05.01.2010,我的函数应该返回一个date列表(List),并且它必须包含01.01.2010,02.01.2010,03.01.2010,0.01.2010和05.01.2010。
我写了这样的function。 如果我的date在一个月内,它工作正常。 如果我的date是01.01.2010 – 05.02.2010,那么这将不起作用。 因为月份改变了,我的function无法处理。 在C#中有一个函数返回两个date之间的所有date? 或者我如何处理月份变化?
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)); }
问题解决了,请参阅Tim Robinson简单的使用答案。
您可以直接在循环中使用DateTime
对象,而不是int
。 DateTime.AddDays
处理月正确结束。
for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1)) allDates.Add(date);
这样的事情呢?
public IEnumerable<DateTime> DateRange(DateTime fromDate, DateTime toDate) { return Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1) .Select(d => fromDate.AddDays(d)); }
编辑:现在testing。 🙂
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); } }
你是如此接近…只是不使用一天,使用整个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(); }
这里是一个快速的控制台应用程序来演示如何做 – 使用AddDays()
而不是:
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; } }
给定一个更低的值和更高的date值在string和频率作为第三个参数这个方法应该返回一个date字典; 其中键是date范围的起始值,并且该值是相应的范围。 如果频率是每周或每月 – 这可以正常工作,您可以根据需要自定义它。 传递的date值应该是正确的格式,或者你可能需要使用tryParseExact或类似的格式。
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; }
如果date包括不同的小时数,则顶级解决scheme将失败。 这是一个解决所有时间和所有日子的解决scheme:
每天:
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; }
所有小时:
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; }
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(); }