我需要一些模型有关的信息的季节,和需要跟踪他们的基础上开始/结束的日期在一年中立的方式。I.e。我需要允许用户定义的夏天为之间,比如说,可月15日和10日,以及这样做的所有年份。

我只需要做很多的检查类型isThisDateInSeason).所有的日期操纵功能(即日期、日)似乎只适用的有效日期,即包括年的信息。

是否有任何最佳做法,围绕如何做到这一点?我能想到的一堆哈克的方式这样做(即储存的月份和日期或储存的日期,并仅仅把他们带到一个基准年这样我可以可以比较),但似乎有可能是一个更好的办法。

我写这Java或常规。

会的 乔达时 图书馆的帮助在这里?我没有与它的经验,但它看起来有更多的灵活性。

我找到了 这个问题 有关如何识别一个季节从日期,但是,重点是上个月,我需要更多的灵活性,以包括日期。

有帮助吗?

解决方案

如果每个用户拥有自己的数据(即他们指定的其季然后他们进入他们自己的信息)然后你只能储存数据的季节作为它的一部分,但是我有一种感觉的方案之后是为共享数据跨越众多的用户定义的季节不同。

你就必须要非常小心'正常'的日期作为闰年可能会导致意想不到的问题,即试图设置月29无闰年将引起的问题/情况例外。

我已经把下面一起,unforutnatly其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;
        }

    }
}

注意上述代码的假设,本赛季不会开始和结束在同一个月相当安全的一个我认为!

其他提示

我认为你必须推出自己的DateRange类,虽然这是一个常见的问题,你希望已经有一个聪明的实用程序可以做到这一点。作为处理季节的一般要点,你还必须考虑到地理,这将使生活变得非常困难。在奥兹国,我们与美国相反,因此夏季从11月到2月。

数据在哪里?如果它在数据库中,我会考虑为日期创建一个表(如OLAP中的时间维度)。然后,您可以根据某些时间维度示例中的财务季度计算季节列。 (这假设你的季节不会改变但是有固定的日期)。

所有“if date in season”类型检查将预先建立,将计算季节的成本计入您的设置时间,而不是运行时间。

修改:刚刚看到您对用户可配置季节日期的评论。这仍然有效,因为您可以在数据库中进行连接,包括时间维度,这可以更容易地使用Java中的数据集。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top