[英]How to group a period of time into yearly periods ? (split timespan into yearly periods)
我有兩個日期時間范圍:
DateTime start = new DateTime(2012,4,1);
DateTime end = new DateTime(2016,7,1);
我希望獲得此期間之間按年分組的所有期間。 意味着輸出必須是:
2012-04-01 - 2012-12-31
2013-01-01 - 2013-12-31
2014-01-01 - 2014-12-31
2015-01-01 - 2015-12-31
2016-01-01 - 2016-07-01
優選地,輸出將在IList<Tuple<DateTime,DateTime>>
列表中。
你會怎么做? 無論如何,LINQ是否可以做到這一點?
哦,夏時制不是絕對重要的,但肯定是一個好處。
謝謝!
static IList<Tuple<DateTime, DateTime>> GetDateRangesByYear(DateTime start, DateTime end)
{
List<Tuple<DateTime, DateTime>> ranges = new List<Tuple<DateTime,DateTime>>();
for (int year = start.Year; year <= end.Year; ++year)
{
DateTime yearBegin = year == start.Year ? start : new DateTime(year, 1, 1);
DateTime yearEnd = year == end.Year ? end : new DateTime(year, 12, 31);
ranges.Add(Tuple.Create(yearBegin, yearEnd));
}
return ranges;
}
DateTime start = new DateTime(2012,4,1);
DateTime end = new DateTime(2016,7,1);
var dates = from year in Enumerable.Range(start.Year,end.Year-start.Year+1)
let yearStart=new DateTime(year,1,1)
let yearEnd=new DateTime(year,12,31)
select Tuple.Create(start>yearStart ? start : yearStart, end<yearEnd ? end : yearEnd);
IList<Tuple<DateTime,DateTime>> result = dates.ToList();
關於什么:
static public List<Tuple<DateTime, DateTime>> GroupByYear(DateTime start, DateTime end)
{
List<Tuple<DateTime, DateTime>> datetimes = Enumerable.Range(start.Year + 1, end.Year - 1 - start.Year)
.Select(x => new Tuple<DateTime, DateTime>(new DateTime(x, 1, 1), new DateTime(x, 12, 31)))
.ToList();
datetimes.Add(new Tuple<DateTime, DateTime>(start, new DateTime(start.Year, 12, 31)));
datetimes.Add(new Tuple<DateTime, DateTime>(new DateTime(end.Year, 1, 1), end));
return datetimes.OrderBy(x => x.Item1.Year).ToList();
}
我沒有檢查所有邊緣情況,但是大多數情況下應該這樣做
IList<Tuple<DateTime, DateTime>> GetYearPeriods(DateTime start, DateTime end)
{
var years = end.Year - start.Year - 1;
var startDates = Enumerable.Range(start.Year+1, years)
.Select(year => new DateTime(year, 1, 1));
var endDates = Enumerable.Range(start.Year+1, years)
.Select(year => new DateTime(year, 12, 31));
var firstPeriod = Tuple.Create(start, new DateTime(start.Year, 12, 31));
var middlePeriods = startDates.Zip(endDates, (s,e) => Tuple.Create(s, e));
var lastPeriod = Tuple.Create(new DateTime(end.Year, 1, 1), end);
return
(new[] {firstPeriod}).Union(middlePeriods).Union(new[] {lastPeriod}).ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.