在一系列日期内获取季节

时间:2015-04-17 10:18:55

标签: c# algorithm date

我需要输入代表日期范围的2个日期。对于这些给定的日期,我需要返回这些日期之间的季节列表。是否可以在不需要迭代该范围之间的所有日子的情况下获得解决方案?

例如日期:2014年12月25日 - 2015年7月17日 结果将是:冬季,春季,夏季


季节将以恒定值指定 季节:

  • 冬季:12月21日 - 3月20日
  • 春季:3月21日 - 6月20日
  • 夏季:6月21日至9月20日
  • 秋季:9月21日 - 21日 腊

例如,常量将存储如下。我发现的主要问题是冬季,因为这一年将增加1,月份将从1开始。

    DateTimeOffset winterStart= new DateTimeOffset(year, 12, 21,0,0,0,new TimeSpan(0));
    DateTimeOffset winterEnd = new DateTimeOffset(year, 03, 19, 0, 0, 0, new TimeSpan(0));

    DateTimeOffset springStart = new DateTimeOffset(year, 03, 20,0,0,0,new TimeSpan(0));
    DateTimeOffset springEnd = new DateTimeOffset(year, 06, 19, 0, 0, 0, new TimeSpan(0));

    DateTimeOffset summerStart = new DateTimeOffset(year, 06, 20, 0, 0, 0, new TimeSpan(0));
    DateTimeOffset summerEnd = new DateTimeOffset(year, 09, 21, 0, 0, 0, new TimeSpan(0));

    DateTimeOffset autumStart = new DateTimeOffset(year, 09, 22, 0, 0, 0, new TimeSpan(0));
    DateTimeOffset autumEnd = new DateTimeOffset(year, 12, 20, 0, 0, 0, new TimeSpan(0));

2 个答案:

答案 0 :(得分:0)

季节是一个相对的术语,取决于位置。就像在澳大利亚一样,它在亚洲的夏天结束,这是夏天的开始。此外,季节的持续时间因地球而异。在欧洲,春季持续时间更长,而在南亚,仅仅是名字。所以要求它是非常广泛的事情。

答案 1 :(得分:0)

如果您使用季节的特定日期范围,则无需每天检查该范围;我认为应该每3个月做一次,例如

// get start and end as DateTime

int year;
DateTime springStart, summerStart, autumnStart, winterStart;

for (DateTime date = start; date < end; date = date.AddMonths(3))
{ 
    year = date.Year;
    springStart = new DateTime(year, 3, 21);
    //etc...
    if (date >= springStart && date < summerStart)
    { //etc...}
    else if (date >= winterStart || date < springStart)
    { //etc...}
}