我需要建模一些关于季节的信息,并且需要以一年不可知的方式基于开始/结束日期跟踪它们.即我需要允许用户将夏天定义为介于5月15日和9月10日之间,并且将其用于所有年份.
我需要做很多检查类型isThisDateInSeason).所有日期操作功能(即日期,日历)似乎仅适用于有效日期,即包括年份信息.
有没有关于如何做到这一点的最佳实践?我可以想到一堆hacky方法(即存储月份或日期或存储日期,只需将它们带到基准年,这样我就可以比较),但似乎可能有更好的方法.
我用Java或Groovy编写这个.
Joda-Time图书馆会帮忙吗?我没有它的经验,但它看起来有更多的灵活性.
我找到了this question关于如何确定一个季节的日期,但是重点关注几个月,我需要更多的灵活性来包含日期.
解决方法:
如果每个用户拥有自己的数据(即他们指定他们的季节,然后他们输入他们自己的信息),那么你可以将季节中的数据作为其中的一部分存储,但是我感觉你所追求的场景是用于共享数据众多用户之间的定义不同.
您必须非常小心地“标准化”日期,因为闰年可能会导致意外问题,即尝试在非闰年设置2月29日将导致问题/例外.
我已将下面的内容放在一起,不可思议的是它的c#,但概念将是相同的.我实际上已经测试了代码,但是就像psudo代码一样,它可能有所帮助.
public class SeasonChecker
{
public enum Season {Summer, Autumn, Winter, Spring};
private List<SeasonRange> _seasons = new List<SeasonRange>();
public void Defineseason(Season season, DateTime starting, DateTime ending)
{
starting = starting.Date;
ending = ending.Date;
if(ending.Month < starting.Month)
{
// split into 2
DateTime tmp_ending = new DateTime(ending.Year, 12, 31);
DateTime tmp_starting = new DateTime(starting.Year, 1, 1);
SeasonRange r1 = new SeasonRange() { Season = season, Starting= tmp_starting, Ending = ending };
SeasonRange r2 = new SeasonRange() { Season = season, Starting= starting, Ending = tmp_ending };
this._seasons.Add(r1);
this._seasons.Add(r2);
}
else
{
SeasonRange r1 = new SeasonRange() { Season = season, Starting= starting, Ending = ending };
this._seasons.Add(r1);
}
}
public Season GetSeason(DateTime check)
{
foreach(SeasonRange range in _seasons)
{
if(range.InRange(check))
return range.Season;
}
throw new ArgumentOutOfRangeException("Does not fall into any season");
}
private class SeasonRange
{
public DateTime Starting;
public DateTime Ending;
public Season Season;
public bool InRange(DateTime test)
{
if(test.Month == Starting.Month)
{
if(test.Day >= Starting.Day)
{
return true;
}
}
else if(test.Month == Ending.Month)
{
if(test.Day <= Ending.Day)
{
return true;
}
}
else if(test.Month > Starting.Month && test.Month < Ending.Month)
{
return true;
}
return false;
}
}
}
请注意,上面的代码假设赛季不会在同一个月开始和结束 – 我认为这是一个相当安全的赛季!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。