获取日期范围内的日期列表
本文关键字:日期 列表 范围内 取日期 获取 | 更新日期: 2023-09-27 18:03:49
假设我有一个LockedDate列表。
LockedDate具有DateTime和IsYearly布尔。如果IsYearly为真,则不应考虑年份,因为它可以是任何年份。永远不要考虑时间。
例如:X-Mas,每年12月25日。
现在我有一个锁定日期列表。
没有重复项。
现在我需要这个功能:
此功能将执行以下操作:如果LockedDate不是年度,并且日期、月份和年份在来源的范围内,则添加到返回列表中。
如果LockedDate是每年一次的,并且其月/日在该范围内,则为该范围内的每一年添加一个新日期。
假设我有12月25日与IsYearly是真的。我的范围是2013年1月22日至2015年2月23日(含(。需要将2013年12月25日作为新日期,并将2014年12月5日作为新的日期添加到列表中。
List<Date> GetDateRange(List<LockedDate> source, DateTime start, DateTime end)
{
}
感谢
Dec 25 Yearly -> Dec 25 2013, Dec 25 2014
Dec 2, 2011 NOT Yearly -> Nothing
March 25, 2013 => March 25 2013
这可能至少会给你一个想法,它还没有经过测试:
List<DateTime> GetDateRange(List<LockedDate> source, DateTime start, DateTime end)
{
if (start > end)
throw new ArgumentException("Start must be before end");
var ts = end - start;
var dates = Enumerable.Range(0, ts.Days)
.Select(i => start.AddDays(i))
.Where(d => source.Any(ld => ld.Date == d
|| (ld.IsYearly && ld.Date.Month == d.Month && ld.Date.Day == d.Day)));
return dates.ToList();
}
更新以下是您的示例数据演示,它似乎可以工作:http://ideone.com/3KFi97
此代码在不使用Linq:的情况下完成您想要的操作
List<DateTime> GetDateRange(List<LockedDate> source, DateTime start, DateTime end)
{
List<DateTime> result = new List<DateTime>();
foreach (LockedDate lockedDate in source)
{
if (!lockedDate.IsYearly && (lockedDate.Date >= start && lockedDate.Date <= end))
{
result.Add(lockedDate.Date);
}
else if (lockedDate.IsYearly && (lockedDate.Date >= start && lockedDate.Date <= end))
{
DateTime date = new DateTime(start.Year, lockedDate.Date.Month, lockedDate.Date.Day);
do
{
result.Add(date);
date = date.AddYears(1);
} while (date <= end);
}
}
return result;
}
一定要问你不理解的部分,这样我可以详细解释,但我认为这很简单。
此代码假定LockedDate
类具有DateTime
对象的属性Date
。
var notYearly = lockDates.Where(d => !d.IsYearly && (d.Date.Date >= start && d.Date.Date <= end)).Select(d => d.Date);
var years = ((end - start).Days / 365) + 2;
var startYear = start.Year;
var yearly = lockDates.Where(d => d.IsYearly)
.SelectMany(d => Enumerable.Range(startYear, years)
.Select(e => new DateTime(e, d.Date.Month, d.Date.Day))
.Where(i => i.Date >= start && i.Date <= end));
var allDates = notYearly.Union(yearly)
如果日期合适的话,应该比在开始、结束和检查之间的所有日子里迭代更有效。
如果您有这样的类锁定日期:
public class LockedDate
{
public DateTime Date { get; set; }
public bool IsYearly { get; set; }
...
}
然后你可以使用这个代码来获得你需要的日期:
List<DateTime> GetDateRange(List<LockedDate> source, DateTime start, DateTime end)
{
List<DateTime> dt = new List<DateTime>();
foreach(LockedDate d in source)
{
if(!d.IsYearly)
{
if(start<=d.Date && d.Date<=end)
dt.Add(d.Date);
}
else
{
for(DateTime i = new DateTime(start.Year,d.Date.Month,d.Date.Day);i<=new DateTime(end.Year,d.Date.Month,d.Date.Day);i=i.AddYears(1))
{
dt.Add(i);
}
}
}
return dt;
}