各ユーザーが独自のデータを所有している場合(つまり、季節を指定してから独自の情報を入力する場合)、季節をその一部としてデータを保存するだけで済みますが、あなたが求めているシナリオは共有データ用であると感じています季節を異なって定義する多数のユーザー間で。
うるう年は予期しない問題を引き起こす可能性があるため、日付の「正規化」には細心の注意を払う必要があります。つまり、2 月 29 日をうるう年以外に設定しようとすると、問題や例外が発生します。
以下をまとめましたが、残念ながらそのc#ですが、コンセプトは同じです。私は実際にコードをテストしたことはありませんが、疑似コードとしても役立つかもしれません。
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;
}
}
}
上記のコードは、シーズンが同じ月に開始および終了しないことを前提としていることに注意してください。これはかなり安全だと思います!